C - Knapsack problem FZU - 2214

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
1
5 15
12 4
2 2
1 1
4 10
1 2
Sample 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;
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324536091&siteId=291194637