这是一道模板题,然后看书查资料,基本上就是可以直接抄模板,记得建立相应的数据就好。
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
}