Bone Collector -简单01背包

来源:互联网 发布:mac安装win10镜像 编辑:程序博客网 时间:2024/06/01 08:05

Bone Collector


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 2[sup]31[/sup]).

 


Sample Input

15 101 2 3 4 55 4 3 2 1

 


Sample Output

14


#include <bits/stdc++.h>using namespace std;int N;//物品个数int V;//背包最大容量int weight[1005];//物品体积int value[1005];//物品价值int f[1005];int ZeroOnePack(){    memset(f,0,sizeof(f));    //递推    for (int i = 0;i < N;i++) //枚举物品(注意物品的编号)    {        for (int j = V;j >= weight[i];j--) //枚举背包容量,防越界,j下限为 weight[i]!!!        {            f[j] = max(f[j],f[j - weight[i]] + value[i]);            //cout << j << " " << f[j] << endl;        }    }    return f[V];}int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d %d",&N,&V);        for(int i=0;i<N;i++)        {            scanf("%d",&value[i]);        }        for(int i=0;i<N;i++)        {            scanf("%d",&weight[i]);        }        cout << ZeroOnePack() << endl;    }    return 0;}


原创粉丝点击