二位数组实现01背包算法:
#include<stdio.h> int main() { int max(int x,int y); int v,n,a[105],b[105],c[105][105],i,j; scanf("%d %d",&v,&n); for(i=1;i<=n;i++) scanf("%d %d",&a[i],&b[i]); for(i=1;i<=n;i++) for(j=1;j<=v;j++) { if(a[i]>j) c[i][j]=c[i-1][j]; else c[i][j]=max(c[i-1][j],(c[i-1][j-a[i]]+b[i])); } printf("%d ",c[n][v]); } int max(int x,int y) { if(x>=y) return x; else return y; }
一维数组实现01背包算法:
#include<iostream> #include<cstring> using namespace std; int cheak[2000][2000]; int main() { int m,n,v[1005],val[1005],dp[2000]; while(cin>>m>>n) { memset(dp,0,sizeof(dp)); memset(cheak,0,sizeof(cheak)); for(int i=1;i<=n;++i) cin>>v[i]>>val[i]; for(int i=n;i>=1;--i) for(int j=m;j>=v[i];--j) { if(dp[j]<(dp[j-v[i]]+val[i])) { dp[j]=dp[j-v[i]]+val[i]; cheak[i][j]=1; } } cout<<dp[m]<<endl; } }
01背包取的物品是那些,取物品路径,价值,容量:
#include<iostream> #include<cstring> using namespace std; int cheak[2000][2000]; int main() { int m,n,v[1005],val[1005],dp[2000]; while(cin>>m>>n) { memset(dp,0,sizeof(dp)); memset(cheak,0,sizeof(cheak)); for(int i=1;i<=n;++i) cin>>v[i]>>val[i]; for(int i=n;i>=1;--i) for(int j=m;j>=v[i];--j) { if(dp[j]<(dp[j-v[i]]+val[i])) { dp[j]=dp[j-v[i]]+val[i]; cheak[i][j]=1; } } cout<<dp[m]<<endl; int i=1,j=m; while(i<=n&&j>0) { if(cheak[i][j]) { cout<<i<<" "; j=j-v[i]; } i++; } } }