HDU 2602-Bone Collector

来源:互联网 发布:国际空间站直播软件 编辑:程序博客网 时间:2024/06/10 08:30

Bone Collector

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 67547    Accepted Submission(s): 28207


题目链接:点击打开链接



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 ?

 

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 231).


Sample Input
1
5 10
1 2 3 4 5
5 4 3 2 1
 


Sample Output
14


题目意思:
有一个“骨收藏家”,喜欢收藏一些骨头,他有一个容量为 V 的包,用来装骨头,现在这里有一些骨头,给出骨头的体积和价值,让你求他最多能获得多大的价值。

分析:
简单的 01 背包。


#include <iostream>#include<stdio.h>#include<cmath>#include<string.h>using namespace std;int main(){   int s[1010],dp[1010],h[1010];   int n,v,t;   scanf("%d",&t);   while(t--)   {       scanf("%d %d",&n,&v);       memset(dp,0,sizeof(dp));       memset(s,0,sizeof(s));       for(int i=0;i<n;i++)           scanf("%d",&s[i]);        for(int i=0;i<n;i++)            scanf("%d",&h[i]);       for(int i=0;i<n;i++)       {           for(int j=v;j>=h[i];j--)                dp[j]=max(dp[j],dp[j-h[i]]+s[i]);       }       printf("%d\n",dp[v]);   }    return 0;}