多重揹包(普通 二分優化)

2021-09-25 12:14:13 字數 1114 閱讀 7164

有 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 表示取第...