1. 程式人生 > 其它 >揹包九講(3)

揹包九講(3)

揹包九講(3)

多重揹包問題 I

有 N 種物品和一個容量是 V 的揹包。

第 ii 種物品最多有 si 件,每件體積是 vi,價值是 wi。

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

輸入格式

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

接下來有 N 行,每行三個整數 vi,,wi,si,用空格隔開,分別表示第 i 種物品的體積、價值和數量。

輸出格式

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

資料範圍

0<N,V≤1000<N,V≤100
0<vi,wi,si≤1000<vi,wi,si≤100

輸入樣例

4 5
1 2 3
2 4 1
3 4 3
4 5 2

輸出樣例:

10

思路:

​ 本題在瞭解過01揹包和完全揹包問題後較為簡單,就是在選擇拿時要考慮拿幾個。同時n,v最大為100,可以使用最簡單的三重遍歷,優化一下01揹包即可。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1010;
int v[N];//物品體積
int w[N];//價值
int c[N];//數量
int f[N];//揹包大小為N時的最大價值
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++)cin>>v[i]>>w[i]>>c[i];
    //01揹包模板
    for(int i=0;i<n;i++){//列舉物品
        for(int j=m;j>=0;j--){//體積從大到小
            //拿幾件
            for(int k=0;k<=c[i]&&j>=k*v[i];k++){
                f[j]=max(f[j],f[j-k*v[i]]+k*w[i]);
            }
        }
    }
    cout<<f[m];
}