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.
For each test case, output the maximum value.
1 5 15 12 4 2 2 1 1 4 10 1 2Sample Output
15
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int maxn=510; ll dp[5010]; ll w[maxn],v[maxn]; /* Backpack It's not too difficult, but it's a bit difficult to understand We have to have an entry, and then dp is fine, don't think of everything as the same */ int main(){ int T; scanf("%d",&T); while(T--){ int n, tv; scanf("%d %d",&n,&tv); memset(dp,-1,sizeof(dp)); for(int i=1;i<=n;i++){ scanf("%I64d %I64d",&w[i],&v[i]); } dp[0]=0; for(int i=1;i<=n;i++){ for(int j=5000;j>=v[i];j--){ if(dp[j-v[i]]==-1||dp[j-v[i]]+w[i]>tv) continue; dp[j]=dp[j]==-1?dp[j-v[i]]+w[i]:min(dp[j],dp[j-v[i]]+w[i]); } } int ans=0; for(int i=0;i<=5000;i++){ if(dp[i]!=-1)ans=i; } printf("%d\n",ans); } return 0; }