HDU 2602 Bone Collector(01背包问题)

Description
传说中有一位“白骨收藏者”,他有各种各样的白骨,每种白骨有一个体积和一个价值,现在他带着一个容量为v的背包出去旅行,路途中他又见到各种白骨,问他最后收获的白骨的最大价值
Input
第一行为用例组数T,每组用例第一行为两个整数n和v分别表示白骨个数以及背包容量,第二行n个整数分别表示每根白骨的价值,第三行n个整数表示每根白骨的体积
Output
对于每组用例,输出白骨收藏者最后收获的白骨的最大价值
Sample Input
1
5 10
1 2 3 4 5
5 4 3 2 1
Sample Output
14
Solution
简单01背包,令dp[j]为得到体积为j的白骨的最大价值,那么对于每根白骨都有dp[j]=max(dp[j],dp[j-w[i]]+v[i]),最后dp[v]即为答案
Code

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 1111
int dp[maxn];
int val[maxn],vo[maxn];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,v;
        scanf("%d%d",&n,&v);
        for(int i=0;i<n;i++)
            scanf("%d",&val[i]);
        for(int i=0;i<n;i++)
            scanf("%d",&vo[i]);
        memset(dp,0,sizeof(dp));//初始化 
        for(int i=0;i<n;i++)//01背包 
            for(int j=v;j>=vo[i];j--)
                dp[j]=max(dp[j],dp[j-vo[i]]+val[i]);
        printf("%d\n",dp[v]);
    }
    return 0;
}

你可能感兴趣的:(HDU 2602 Bone Collector(01背包问题))