Bone Collector(01背包,模板题)

来源:互联网 发布:义乌聚宝软件 编辑:程序博客网 时间:2024/05/16 17:21
C - Bone Collector
Time Limit:1000MS    Memory Limit:32768KB    64bit IO Format:%I64d & %I64u
SubmitStatusPracticeHDU 2602

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

15 101 2 3 4 55 4 3 2 1
 

Sample Output

14 AC代码:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 1010;int n, vb;int r[MAXN], v[MAXN];int dp[MAXN][MAXN];int rec(int i, int j){    if (dp[i][j] >= 0)    {        return dp[i][j];    }    int res;    if (i == n)    {        res = 0;    }    else if (j < r[i])    {        res = rec(i + 1, j);    }    else    {        res = max (rec(i + 1, j), rec(i + 1, j - r[i]) + v[i]);    }    return dp[i][j] = res;}int main(){    int t;    scanf("%d", &t);    while (t--)    {        memset(r, 0, sizeof (r));        memset(v, 0, sizeof (v));        memset(dp, -1, sizeof (dp));        scanf("%d%d", &n, &vb);        for (int i=0; i<n; i++)        {            scanf("%d", &v[i]);        }        for ( int i=0; i<n; i++)        {            scanf("%d", &r[i]);        }        printf("%d\n", rec(0, vb));    }    return 0;}

一次A了!
0 0