01背包

来源:互联网 发布:三国杀菜刀的淘宝 编辑:程序博客网 时间:2024/05/16 05:32

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

15 101 2 3 4 55 4 3 2 1
 

Sample Output

14
#include<iostream>#include<string.h>#include<stdio.h>#include<ctype.h>#include<algorithm>#include<stack>#include<queue>#include<set>#include<math.h>#include<vector>#include<deque>#include<list>using namespace std;int dp[2000],m;void ZeroOnePack(int cost,int weight){      int v;      for(v=m;v>=cost;v--)           if(dp[v]<dp[v-cost]+weight)//比较0,1的大小                 dp[v]=dp[v-cost]+weight;}int main(){      int i,t,n,c[1001],w[1001];      scanf("%d",&t);      while(t--)      {           scanf("%d%d",&n,&m);           for(i=0;i<n;i++)           cin>>w[i];           for(i=0;i<n;i++)           cin>>c[i];           memset(dp,0,sizeof(dp));           for(i=0;i<n;i++)                 ZeroOnePack(c[i],w[i]);           printf("%d\n",dp[m]);      }      return 0;}


0 0
原创粉丝点击