有 n 種物品和乙個容量是 v 的揹包。
第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。
求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。
輸出最大價值。
第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。
接下來有 n 行,每行三個整數 vi,wi,si,用空格隔開,分別表示第 i 種物品的體積、價值和數量。
輸出乙個整數,表示最大價值。
04 5
1 2 3
2 4 1
3 4 3
4 5 2
10
普通:
#include#include#include#includeusing namespace std;
const int n = 1005;
int dp[n];
int c[n],w[n],num[n];
int n,m;
int main()
for(int i=1;i<=n;i++)}}
cout << dp[m] << endl;
return 0;
}
二分優化:
#include#include#include#includeusing namespace std;
const int n = 1005;
int dp[n];
int c[n],w[n],num[n];
int n,m;
void zeroone_pack(int cost,int weight,int n)//吧01揹包封裝成函式
void complete_pack(int cost,int weight,int n)//把完全揹包封裝成函式
int multi_pack(int c,int w,int num,int n,int m)//多重揹包
zeroone_pack(num[i]*c[i],num[i]*w[i],m);}}
return dp[m];
}int main()
return 0;
}
硬幣問題 (dp,多重揹包的二分優化)
給你n種硬幣,知道每種的面值ai和每種的數量ci。問能湊出多少種不大於m的面值。有多組資料,每一組第一行有兩個整數 n 1 n 100 和m m 100000 第二行有2n個整數,即面值a1,a2,a3,an和數量c1,c2,c3,cn 1 ai 100000,1 ci 1000 所有資料結束以2個...
多重揹包優化演算法
二進位制優化 題面 有n中面額的錢,每種有ci個,問1 m裡有多少個數能用這些錢組成。1 int n,m,a 105 num 105 dp 100005 2 void comdp int w,intv 3 8void zeroone int w,intv 9 14void multidp int w...
單調佇列優化多重揹包
多重揹包的最原始的狀態轉移方程 令 c i min num i j v i f i j max f i 1 j k v i k w i 1 k c i 這裡的 k 是指取第 i 種物品 k 件。如果令 a j v i b j v i 那麼 j a v i b.這裡用 k 表示的意義改變,k 表示取第...