1. 程式人生 > >Bone Collector 01揹包個人理解

Bone Collector 01揹包個人理解

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. usingnamespace 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. */