这是一道模板题,然后看书查资料,基本上就是可以直接抄模板,记得建立相应的数据就好。
http://blog.sina.com.cn/s/blog_8cf6e8d90100zldn.html这是一个关于背包问题的讲解,可以找时间看一下。
#include<iostream> #include<cmath> #include<cstring> using namespace std; int d[1005][1005],m[1005],v[1005]; int main() { int n,N,V,ans=0; cin>>n; while(n--) { cin>>N>>V; for(int i=1;i<=N;i++) cin>>m[i]; for(int i=1;i<=N;i++) cin>>v[i]; memset(d,0,sizeof(d)); for(int i=1;i<=N;i++) for(int j=0;j<=V;j++) { if(v[i]<=j&&d[i-1][j]<d[i-1][j-v[i]]+m[i]) d[i][j]=d[i-1][j-v[i]]+m[i]; else d[i][j]=d[i-1][j]; } cout<<d[N][V]<<endl; } return 0; }
#include<stdio.h> 02 #include<stdlib.h> 03 #include<string.h> 04 #define N 1001 05 int dp[N]; 06 int c[N],w[N]; 07 int max(int x,int y) 08 { 09 return x>y?x:y; 10 } 11 int main() 12 { 13 int t,n,v,i,j; 14 scanf("%d",&t); 15 while(t--) 16 { 17 scanf("%d%d",&n,&v); 18 for(i=0;i<n;i++) 19 scanf("%d",&c[i]); 20 for(i=0;i<n;i++) 21 scanf("%d",&w[i]); 22 memset(dp,0,sizeof(dp)); 23 for(i=0;i<n;i++) 24 { 25 for(j=v;j>=w[i];j--) 26 dp[j]=max(dp[j],dp[j-w[i]]+c[i]); 27 } 28 printf("%d ",dp[v]); 29 } 30 system("pause"); 31 return 0; 32 } 代码如下:二维的。。。不太习惯。。。不建议用 view source 01 //二维数组实现01背包 02 #include <iostream> 03 #include <algorithm> 04 using namespace std; 05 int dp[1001][1001],vol[1001],val[1001]; 06 int main() 07 { 08 int t,n,i,j,v; 09 cin>>t; 10 while(t--) 11 { 12 cin>>n>>v; 13 for(i=1;i<=n;i++) 14 scanf("%d",&val[i]); 15 for(i=1;i<=n;i++) 16 scanf("%d",&vol[i]); 17 memset(dp,0,sizeof(dp)); //初始化 18 for(i=1;i<=n;i++) 19 for(j=0;j<=v;j++) //注意要从0开始,这个题测试数据有点变态,有的骨头有价值,但占的空间是0 20 { 21 if(vol[i]<=j && dp[i-1][j]<dp[i-1][j-vol[i]]+val[i]) 22 dp[i][j]=dp[i-1][j-vol[i]]+val[i]; 23 else 24 dp[i][j]=dp[i-1][j]; 25 } 26 cout<<dp[n][v]<<endl; 27 } 28 return 0; 29 }