揹包九講之三(多重揹包)

2022-08-24 21:30:12 字數 1605 閱讀 5683

證明如下:

係數可取值

1,2,4,..2^(k-1),n[i]-2^k+1, k是使得n[i]-2^k+1>=0的最大整數

前n項和為2^k-1,那麼最後一項為 n[i]-2^k+1

這些係數之和為n[i],且0--n[i]間的每乙個整數均可以用若干個係數的和表示

證明如下:

①先證明區間0..2^k-1, 我們有係數1,2,4...2^(k-1) 即k個數,第k個數的二進位制的只有第k位為1

而區間0..2^k-1為二進位制第0位到第k-1位是否取值為1的組合,都可以由上面的係數組合得到

②再證明區間2^k..n[i],我們與係數1,2,4,..2^(k-1),n[i]-2^k+1

那麼可以由上面的系陣列和得到

n[i]-0,n[i]-1,n[i]-2,n[i]-3,n[i]-2^k+1,

那麼只要證明n[i]-2^k+1 <2^k,即證明n[i]+1<2^(k+1)

假設n[i]+1>=2^(k+1)成立,即n[i]-2^(k+1)+1>=0成立,

與前面要求的k是使得n[i]-2^k+1>=0的最大整數矛盾,所以假設不成立。

綜合①②,0--n[i]區間的每乙個整數均可以用若干個係數的和表示

1/*2

有n件物品和乙個容量為v的揹包,第i種物品最多有n[i]件可用,

3每件費用是c[i],價值是w[i],求解將哪些物品放入揹包

4使費用總和不超過揹包容量且價值總和最大56

for(i=1; i<=n; ++i)

7for(j=0; j<=v; ++j)

8for(k=0; k*c[i]<=j; ++k)

9dp[i][j] = max(dp[i][j],dp[i-1][j-k*c[i]]+k*w[i]);

10時間複雜度為o(v*∑n[i]);

11另一種思想是二進位制優化,時間複雜度為o(v*∑log(n[i]));

12詳見

13*/

14 #include 15 #include

16int

cash;

17int n[11],dk[11

];18

int dp[1000000

];19 inline int max(const

int &a, const

int &b)

2023

void completepack(int

cost)

2428

void zeroonepack(int

cost)

2933

void multiplepack(int cnt, int

cost)

3446 zeroonepack(cnt*cost);47}

48}49int

main()

5061 printf("

%d\n

",dp[cash]);62}

63return0;

64 }

o(vn)演算法:待學習

揹包九講 三 多重揹包問題

有n種物品和乙個容量為v的揹包,每種物品都有m im i mi 件可用,放入第i件物品的費用是c ic i ci 得到的價值是w iw i wi 求解將哪些物品裝入揹包可使價值綜合最大。如果看過之前的完全揹包問題,這裡的多重揹包問題應該就能秒殺了,當時考慮過將完全揹包轉化為01揹包問題求解,而多重揹...

動態規劃之揹包九講之三 多重揹包

題目 有 n 種物品和乙個容量是 v 的揹包。第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。接下來有 n 行,每行三個整數...

揹包九講之多重揹包

揹包九講原文 有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。這題目和完全揹包問題很類似。基本的方程只需將完全揹包問題的方程略微一改即可,因為對於第i種物品有n i 1種策略 ...