HDU_2602_背包问题

来源:互联网 发布:linux delay 编辑:程序博客网 时间:2024/06/04 22:46

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 <cstdio>#include <cstring>#define MAX_N 1005#define MAX_V 1005using namespace std;long long  w[MAX_N];long long  v[MAX_N];long long  dp[MAX_N][MAX_V];long long  V;long long  n;long long  t,k;int  main(){    //freopen("±³°üF.txt", "r",stdin);    scanf("%d",&t);    k=t;    while(t--)    {        scanf("%d %d",&n,&V);        for(long long  i=0;i<n;i++)        {            scanf("%ld",v+i);        }        for(long long  i=0;i<n;i++)        {            scanf("%ld",w+i);        }        void solve();        solve();    }}void solve(){    memset(dp,0,sizeof(dp));    for(int  i=0;i<n;i++)    {        for(int  j=0;j<=V;j++)        {            if(w[i]>j)            {                dp[i+1][j]=dp[i][j];            }            else{                dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+v[i]);            }        }    }    printf("%ld\n",dp[n][V]);}


这个题还可以采用01滚动的方式
#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define MAX_W 1005#define MAX_N 1005int dp[MAX_W+1];int w[MAX_N];int v[MAX_N];int n;int V;int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d %d",&n,&V);        for(int i=0;i<n;i++)        {            scanf("%d",v+i);        }         for(int i=0;i<n;i++)        {            scanf("%d",w+i);        }        void solve();        solve();    }}void solve(){    memset(dp,0,sizeof(dp));    for(int i=0;i<n;i++)    {        for(int j=V;j>=w[i];j--)        {            dp[j]=max(dp[j],dp[j-w[i]]+v[i]);        }    }    printf("%d\n",dp[V]);}


0 0
原创粉丝点击