题意:有人收集有价值的骨头,并放入一个背包中,求放入背包的骨头的总价值的最大的放法。
思路:01背包问题,先遍历一遍所有的可能,在容量为j的背包中放i件骨头时,第i件物品的方法有两种可能,放与不放,由此可以写出dp方程:f[j]=max(dp[j],f[j-w[i]]+c[i)];
感想:注意从最大容量开始,以防更新数据时出现错误,还有要注意优化问题。
代码:
<span style="font-size:14px;color:#330000;">#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
int c[1010];
int w[1010];
int f[1010];
int main()
{
int T,v,n,i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&v);
for(i=0;i<n;++i)
scanf("%d",&c[i]);
for(i=0;i<n;++i)
scanf("%d",&w[i]);
memset(f,0,sizeof(f));
for(i=0;i<n;++i)
{
for(j=v;j>=w[i];--j)
{
if(f[j-w[i]]+c[i]>f[j])
f[j]=f[j-w[i]]+c[i];
}
}
printf("%d\n",f[v]);
}
return 0;
}</span>