多重揹包_ACM模板

多重揹包

題目描述
爲了挽救災區同胞的生命,心繫災區同胞的你準備自己採購一些糧食支援災區,現在假設你一共有資金n元,而市場有m種大米,每種大米都是袋裝產品,其價格不等,並且只能整袋購買。
請問:你用有限的資金最多能採購多少公斤糧食呢?
Input
輸入數據首先包含一個正整數C,表示有C組測試用例,每組測試用例的第一行是兩個整數n和m(1<=n<=100, 1<=m<=100),分別表示經費的金額和大米的種類,然後是m行數據,每行包含3個數p,h和c(1<=p<=20,1<=h<=200,1<=c<=20),分別表示每袋的價格、每袋的重量以及對應種類大米的袋數。

Output
對於每組測試數據,請輸出能夠購買大米的最多重量,你可以假設經費買不光所有的大米,並且經費你可以不用完。每個實例的輸出佔一行。

Sample Input

1
8 2
2 100 4
4 100 2

Sample Output

400

const int maxn = 1e2 + 5;
int t, n, W;
int v[maxn];//價格
int w[maxn];//質量
int num[maxn];//數量
int weight[2005];
int value[2005];
int f[2005];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> t;
	while (t--) {
		cin >> W >> n;
		for (int i = 0; i < n; i++)
			cin >> v[i] >> w[i] >> num[i];
		int k = 0;
		for (int i = 0; i < n; i++)
			for (int j = 0; j < num[i]; j++) {
				weight[k] = w[i];
				value[k] = v[i];
				k++;
			}
		memset(f, 0, sizeof(f));
		for (int i = 0; i < k; i++) {
			for (int j = W; j > 0; j--) {
				if (j >= value[i]) {
					f[j] = max(f[j], f[j - value[i]] + weight[i]);
				}
			}
		}
		cout << f[W] << endl;
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章