【例9.14】混合揹包

weixin_30639719發表於2020-04-05

 

連結:http://ybt.ssoier.cn:8088/problem_show.php?pid=1270


時間限制: 1000 ms         記憶體限制: 65536 KB

【題目描述】

一個旅行者有一個最多能裝V公斤的揹包,現在有n件物品,它們的重量分別是W1,W2,...,Wn,它們的價值分別為C1,C2,...,Cn。有的物品只可以取一次(01揹包),有的物品可以取無限次(完全揹包),有的物品可以取的次數有一個上限(多重揹包)。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

【輸入】

第一行:二個整數,M(揹包容量,M<=200),N(物品數量,N<=30);

第2..N+1行:每行三個整數Wi,Ci,Pi,前兩個整數分別表示每個物品的重量,價值,第三個整數若為0,則說明此物品可以購買無數件,若為其他數字,則為此物品可購買的最多件數(Pi)。

 

【輸出】

僅一行,一個數,表示最大總價值。

【輸入樣例】

10  3
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int f[205],v[35],w[35],s[35];
int main()
{
    int n,V;
    cin>>V>>n;
    for(int i=1;i<=n;i++)cin>>v[i]>>w[i]>>s[i];
    for(int i=1;i<=n;i++)
        if(s[i]==0)
            for(int j=v[i];j<=V;j++)
                f[j]=max(f[j],f[j-v[i]]+w[i]);
        else 
            for(int j=V;j>=v[i];j--)
                for(int k=1;k<=s[i];k++)
                    if(j-k*v[i]>=0)
                        f[j]=max(f[j],f[j-k*v[i]]+k*w[i]);
    cout<<f[V]<<endl;
    
}

 

2  1  0
3  3  1
4  5  4

【輸出樣例】

11

【提示】

選第一件物品1件和第三件物品2件。

轉載於:https://www.cnblogs.com/EdSheeran/p/7672612.html

相關文章