FZU2214 C

来源:互联网 发布:彼得大帝 知乎 编辑:程序博客网 时间:2024/06/12 00:06

Given a set of n items, each with a weight w[i] and a value v[i], determine a way to choose the items into a knapsack so that the total weight is less than or equal to a given limit B and the total value is as large as possible. Find the maximum total value. (Note that each item can be only chosen once).

Input

The first line contains the integer T indicating to the number of test cases.

For each test case, the first line contains the integers n and B.

Following n lines provide the information of each item.

The i-th line contains the weight w[i] and the value v[i] of the i-th item respectively.

1 <= number of test cases <= 100

1 <= n <= 500

1 <= B, w[i] <= 1000000000

1 <= v[1]+v[2]+...+v[n] <= 5000

All the inputs are integers.

Output

For each test case, output the maximum value.

Sample Input
15 1512 42 21 14 101 2
Sample Output
15

B太大,以价值为背包,求最大价值下最小体积,最后价值从大到小遍历dp,如果一旦有容积小于B,则记录价值,break;
#include <iostream>#include <algorithm>#include <stdio.h>#include <math.h>#include <string.h>using namespace std;int dp[5500];int v[550],w[550];const int inf=0x3f3f3f3f;int main(){int t,n,m;    cin>>t;    while (t--)    {     int sum=0,ans=0;      scanf("%d%d",&n,&m);      for (int i=1;i<=n;i++)      {         scanf("%d%d",&w[i],&v[i]);         sum+=v[i];        }         memset(dp,inf,sizeof(dp));         dp[0]=0;       for (int i=1;i<=n;i++)        for (int j=sum;j>=v[i];j--)          dp[j]=min(dp[j],dp[j-v[i]]+w[i]);        for (int i=sum;i>=0;i--)        {           if (dp[i]<=m)           {             ans=i;             break;           }        }        cout<<ans<<endl;    }    return 0;}


原创粉丝点击