NYOJ 1426-大賣場購物車1【0-1揹包】

神探小小迪發表於2018-09-23

題目描述:

央視有一個大型娛樂節目—購物街,舞臺上模擬超市大賣場,有很多貨物,每個嘉賓分配一個購物車,可以盡情地裝滿購物車,購物車中裝的貨物價值最高者取勝。假設有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;
}

 

相關文章