当前位置: 代码迷 >> 综合 >> NYOJ 1426-大卖场购物车1【0-1背包】
  详细解决方案

NYOJ 1426-大卖场购物车1【0-1背包】

热度:64   发布时间:2023-11-28 06:58:20.0

题目描述:

央视有一个大型娱乐节目—购物街,舞台上模拟超市大卖场,有很多货物,每个嘉宾分配一个购物车,可以尽情地装满购物车,购物车中装的货物价值最高者取胜。假设有n个物品和1个购物车,每个物品i对应价值为vi,重量wi,购物车的容量为W(你也可以将重量设定为体积)。每个物品只有1件,要么装入,要么不装入,不可拆分。在购物车不超重的情况下,如何选取物品装入购物车,使所装入的物品的总价值最大? 

输入描述:

第一行是一个整型数m(m<100)表示共有m组测试数据。
每组测试数据第一行输入,n 和 W(1 <= n <=40,1 <= W <= 1000),接下来有n行,每行输入两个数,代表第i个物品的重量wi 和价值 vi(1 <= wi,vi <= 1000)。

输出描述:

对于每一组输入,输出满足题意的最大价值。
每组的输出占一行。

样例输入:

2
5 10
2 6
5 3
4 5
2 4
3 6
4 52
12 13
10 24
22 13
9 24

样例输出:

17
61

题解:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1000+7;
int w[maxn], v[maxn];
int dp[maxn];
int main()
{int n, W, m;cin >> m;while(m--) {memset(dp, 0, sizeof dp);cin >> n >> W;for(int i = 1; i <= n; i++)cin >> w[i] >> v[i];for(int i = 1; i <= n; i++){for(int j = W; j >= w[i]; j--)dp[j] = max(dp[j], dp[j-w[i]]+v[i]);}cout << dp[W] << endl;}return 0;
}