Bone Collector(01背包)

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 ? 

 

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.
 

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

代码如下:

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<deque>
using namespace std;
typedef long long ll;
#define MAX 0x3f3f3f3f
#define N 1005
struct bag
{
    int c;
    int val;
}bag;
int main()
{
    int t;
    struct bag a[1111];
    cin>>t;
    while(t--)
    {
    	int n,v;
        cin>>n>>v;
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i].val);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i].c);
		int f[1111][1111]={0};
        for(int i=1;i<=n;i++)
            for(int j=0;j<=v;j++)
                if(j-a[i].c>=0&&f[i-1][j]<f[i-1][j-a[i].c]+a[i].val)
                    f[i][j]=f[i-1][j-a[i].c]+a[i].val;
                else
                    f[i][j]=f[i-1][j];
        printf("%d\n",f[n][v]);
    }
    return 0;
}

附某大神代码:

  1. #include<stdio.h>  
  2. #include<iostream>  
  3. #include<queue>  
  4. #include<cstring>  
  5. #include<cmath>  
  6.   
  7. using namespace std;  
  8.   
  9. #define MAXN 1005  
  10.   
  11. int N,V;  
  12. int vol[MAXN],val[MAXN];  
  13. int dp[MAXN];  

  14. int main()  
  15. {  
  16.     int T;  
  17.     scanf("%d",&T);  
  18.     while(T--)  
  19.     {  
  20.         memset(dp,0,sizeof(dp));  
  21.         scanf("%d %d",&N,&V);  
  22.         for(int i=0 ; i<N ; i++)  
  23.         {  
  24.             scanf("%d",&val[i]);  
  25.         }  
  26.         for(int i=0 ; i<N ; i++)  
  27.         {  
  28.             scanf("%d",&vol[i]);  
  29.         }  
  30.         for(int i=0 ; i<N ; i++)  
  31.         {  
  32.             for(int j=V ; j>=vol[i] ; j--)  
  33.             {  
  34.                 dp[j] = max(dp[j],dp[j-vol[i]]+val[i]);  
  35.             }  
  36.         }  
  37.         printf("%d\n",dp[V]);  
  38.     }  
  39.     return 0;  

扫描二维码关注公众号,回复: 1480512 查看本文章

猜你喜欢

转载自blog.csdn.net/baiyi_destroyer/article/details/80571765