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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37867156/article/details/82825148

题目描述:

央视有一个大型娱乐节目—购物街,舞台上模拟超市大卖场,有很多货物,每个嘉宾分配一个购物车,可以尽情地装满购物车,购物车中装的货物价值最高者取胜。假设有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;
}

猜你喜欢

转载自blog.csdn.net/qq_37867156/article/details/82825148