acwing2-01揹包問題

N件物品和一個容量是V的揹包。每件物品只能使用一次。

i件物品的體積是 vi,價值是 wi

求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。
輸出最大價值。

 

輸入格式

第一行兩個整數,NVN,V,用空格隔開,分別表示物品數量和揹包容積。

接下來有 NN 行,每行兩個整數 vi,wivi,wi,用空格隔開,分別表示第 ii 件物品的體積和價值。

輸出格式

輸出一個整數,表示最大價值。

數據範圍

0<N,V10000<N,V≤1000
0<vi,wi10000<vi,wi≤1000

輸入樣例

4 5
1 2
2 4
3 4
4 5

輸出樣例:

8

#include<iostream>
#include<algorithm>

using namespace std;

const int MAXN = 1005;
int w[MAXN];    // 重量 
int v[MAXN];    // 價值 
int f[MAXN][MAXN];  // f[i][j], j重量下前i個物品的最大價值 

int main() 
{
    int n, m;   
    cin >> n >> m;
    for(int i = 1; i <= n; ++i) 
        cin >> w[i] >> v[i];

    for(int i = 1; i <= n; ++i) 
        for(int j = 1; j <= m; ++j)
        {
            //  當前重量裝不進,價值等於前i-1個物品
            if(j < w[i]) 
                f[i][j] = f[i-1][j];
            // 能裝,需判斷 
            else    
                f[i][j] = max(f[i-1][j], f[i-1][j-w[i]] + v[i]);
        }           

    cout << f[n][m];
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章