連結: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件。