Bone Collector
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 16 Accepted Submission(s) : 9
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
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 ?
Input
The first line contain a integer T , the number of cases.
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.
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.
Output
One integer per line representing the maximum of the total value (this number will be less than 2
31).
Sample Input
1 5 10 1 2 3 4 5 5 4 3 2 1
Sample Output
14
Author
Source
HDU 1st “Vegetable-Birds Cup” Programming Open Contest
AC代码:
#include <iostream>
using namespace std;
int max(int &x,int &y)
{
if(x>y)
return x;
else
return y;
}
int main()
{
int i,vv,T,n,V,c[1000],v[1000];
cin>>T;
while(T)
{
int dp[2002]= {};
T--;
cin>>n>>V;
for(i=0; i<n; ++i)
cin>>c[i];//价值
for(vv=0; vv<n; ++vv)
cin>>v[vv];//体积
for(i=0; i<n; ++i)
for(vv=V; vv>=v[i]; --vv)
{
dp[vv]=max(dp[vv],dp[vv-v[i]]+c[i]);//第i件物品,它可以放入背包,背包含量变为vv-v[i],也可以不放入背包,背包还是原样,比较两者大的
}
cout<<dp[V]<<endl;
}
return 0;
}
每次取价值最大的,还余下的空间要与要装的比较,dp储存当前状态下背包里物品的价值,i是第几件,因为体积要不断减少,所以这里是逆序,就是要把前一个状态用上。
它在每次循环中取得dp[v]的最优值,就是装了v体积的东西,而这v体积的东西是装的当前价值最高的东西。假若体积为v,此刻又要装入vv体积东西,而多出来v-vv体积此时也要装价值最高的,在这个v-vv体积的东西是已定的,这样使得dp[v]最大。终于开始略懂背包的动归了!!