證明如下:
係數可取值
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/*2o(vn)演算法:待學習有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 }
揹包九講 三 多重揹包問題
有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種策略 ...