Bone Collector
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 12502 Accepted Submission(s): 4874
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 231).
Sample Input
1 5 10 1 2 3 4 5 5 4 3 2 1
Sample Output
14
Author
Teddy
Source
Recommend
lcy
code:
1 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6 int N,V; 7 int n[1001],v[1001],dp[1001]; 8 int T; 9 int i,j; 10 while(~scanf("%d",&T)) 11 { 12 while(T--) 13 { 14 scanf("%d%d",&N,&V); 15 for(i=1;i<=N;i++) 16 scanf("%d",&v[i]); 17 for(i=1;i<=N;i++) 18 scanf("%d",&n[i]); 19 //------------------------------------------------------------------------------------------------------------- 20 memset(dp,0,sizeof(dp)); 21 for(i=1;i<=N;i++) 22 for(j=V;j>=n[i];j--) 23 { 24 if(dp[j-n[i]]+v[i]>dp[j]) 25 dp[j]=dp[j-n[i]]+v[i]; 26 } 27 //------------------------------------------------------------------------------------------------------------- 28 printf("%d\n",dp[V]); 29 } 30 } 31 return 0; 32 }
自己调试结果:
最大容量V | 物品个数N | Bone Collector | |||||||||||
10 | 5 | ||||||||||||
物品大小n[i] | 物品价值v[i] | 编号 | DP | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
4 | 2 | 2 | 2 | 3 | 3 | 2 | 2 | 2 | 2 | 2 | 0 | 0 | 0 |
3 | 3 | 3 | 3 | 6 | 5 | 5 | 5 | 3 | 3 | 3 | 3 | 0 | 0 |
2 | 4 | 4 | 4 | 9 | 9 | 7 | 7 | 7 | 7 | 7 | 4 | 4 | 0 |
1 | 5 | 5 | 5 | 14 | 12 | 12 | 12 | 12 | 12 | 9 | 9 | 5 | 5 |