Bone Collector 01 backpack personal understanding

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 ? 

InputThe 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. OutputOne 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

  1. #include<stdio.h>  
  2. #include<string.h>  
  3. #include<algorithm>  
  4. using namespace std;  
  5. int w[1005];  
  6. int v[1005];  
  7. int dp[1005];  
  8. int  main ()  
  9. {  
  10.     int t,n,m;  
  11.     scanf("%d",&t);  
  12.     while(t--)  
  13.     {  
  14.         memset(w,0,sizeof(w));  
  15.         memset(v,0,sizeof(v));  
  16.         memset(dp,0,sizeof(dp));  
  17.         scanf("%d%d",&n,&m);  
  18.         for(int i=1;i<=n;i++)  
  19.             scanf("%d",&v[i]);  
  20.         for(int i=1;i<=n;i++)  
  21.             scanf("%d",&w[i]);  
  22.         for(int i=1;i<=n;i++)  
  23.         {  
  24.             for(int j=m;j>=0;j--)  
  25.             {  
  26.                 if(j>=w[i])//程序核心代码;在max中,前者代表不放入物体i的情况,后者代表放入物体i的情况,取大值则可得最优,为什么是j-w[i]?是因为此时假设背包已经装满,拿出体积为w[i]价值为0的空气,放入体积为i价值为v[i]的骨头再取大
  27.                 dp[j]=max(dp[j],dp[j-w[i]]+v[i]);  
  28.             }  
  29.         }  
  30.         printf("%d\n",dp[m]);  
  31.     }  
  32.     return 0;  
  33. }  
  34. /* 
  35. 1 
  36. 5 10 
  37. 1 2 3 4 5 
  38. 5 4 3 2 1 
  39. */  

Guess you like

Origin blog.csdn.net/Zhidai_/article/details/79280118