01背包解决一些有一定代价和一定价值的物品,求解所给你所有代价所能取得物品的最多价值,并且一个物品只能取一次。
使用的思想是dp,每步取最优解,每步都有且只有两种情况,取或者不取这两种情况。查找状态方程,f[i][j]=max(f[i-1][j-c[i]]+w[i],f[i-1][j-c[i]]);
该方程中j表示物品的代价,对于每个j而言,都是取能从物品中选择的最大价值,一次累加,直到最后(自己所持有的代价),而i则表示每次放入一个物品,控制放置物品的个数。因此方程也可以转化,改变空间复杂度,即f[j]=max(f[j-c[i]]+w[i],f[j-c[i]]);
Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave …
The bone collector had a big bag with a volume of V ,and along his trip of collecting there are a lot of bones , obviously , different bone has different value and different volume, now given the each bone’s value along his trip , can you calculate out the maximum of the total value the bone collector can get ?

The bone collector had a big bag with a volume of V ,and along his trip of collecting there are a lot of bones , obviously , different bone has different value and different volume, now given the each bone’s value along his trip , can you calculate out the maximum of the total value the bone collector can get ?
Followed by T cases , each case three lines , the first line contain two integer N , V, (N <= 1000 , V <= 1000 )representing the number of bones and the volume of his bag. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.
1 5 10 1 2 3 4 5 5 4 3 2 1
#include<stdio.h>
#include<string.h>
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int i,k,t,m,n,v,j;
int a[1010];
int c[1010];
int w[1010];
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
memset(w,0,sizeof(w));
scanf("%d%d",&n,&v);
for(i=1;i<=n;i++)
scanf("%d",&w[i]);
for(i=1;i<=n;i++)
scanf("%d",&c[i]);
for(i=1;i<=n;i++)
{
for(k=v;k>=c[i];k--)
{
a[k]=max(a[k-c[i]]+w[i],a[k]);
}
}
printf("%d\n",a[v]);
}
return 0;
}