有\(n\)件物品和乙個容量為\(v\)的揹包.第\(i\)件物品體積為\(c_i\),價值為\(w_i\).
求揹包最大價值.
\(f[i][j]\)表示前\(i\)種物品體積為\(j\)的最大價值,
\(f[i][j]=max(f[i-1][j],f[i-1][j-c_i]+w_i)\).
時間複雜度\(o(vn)\).
\(f[j]\)表示體積為\(j\)的最大價值,
\(f[j]=max(f[j],f[j-c_i]+w_i)\)(從大到小列舉\(j\)).
有\(n\)件物品和乙個容量為\(v\)的揹包。第\(i\)種物品最多有\(m_i\)件可用,體積為\(c_i\),價值為\(w_i\).求揹包最大價值.
\(f[i][j]\)表示前\(i\)種物品體積為\(j\)的最大價值,
\(f[i][j]=max(f[i-1][j-c_i\;\times\;k]+w_i\;\times\;k)(0\;\leq\;k\;\leq\;m_i)\)
時間複雜度\(o(vmn)\).
將\(m_i\)拆成\(2^0,2^1,2^2...2^k,m_i-\sum_^(\sum_^,
則在其中任意選取多個數,其和\(\leq\;m_i\);
\([1,m_i]\)間的數都可以通過選取其中多個數得到.
證明:因為每個十進位制數都可拆成二進位制數,\(2^0,2^1,2^2...2^k\)分別代表二進位制某一位上的\(1\),
所以\([1,\sum_^]\)間的數都可以取到.
加上\(m_i-\sum_^\)後,\([m_i-\sum_^+1,m_i]\)間的數都可以取到.
因為\(m_i\;\leq\;\sum_^\),即\(m_i\;\leq\;2^-1\),
所以\(m_i-2\;\times\;2^+1\;\leq\;0\),即\(m_i<2\;\times\;(2^-1)=2\;\times\;\sum_^\).
所以\([1,\sum_^]\cap[m_i-\sum_^+1,m_i]=[1,m_i]\).
description#include#include#include#include#include#include#include#include#include#include#define n 105設有\(1g,2g,3g,5g,10g,20g\)的砝碼各若干枚(其總重\(\leq100000\))要求:計算用這些砝碼能稱出的不同重量的個數,但不包括乙個砝碼也不用的情況。
input
一行,包括六個正整數\(a_1,a_2,a_3,a_4,a_5,a_6\),表示\(1g\)砝碼有\(a_1\)個,\(2g\)砝碼有\(a_2\)個...\(20g\)砝碼有\(a_6\)個。相鄰兩個整數之間用單個空格隔開。
output
以的形式輸出,其中\(n\)為可以稱出的不同重量的個數。
sample input
1 1 0 0 0 0
sample output
total=3
solution
多重揹包二進位制拆分+注意輸出格式。
#define m 100005
using namespace std;
int a[7]=;
int w[n],n,ans;bool f[n][m];
inline void init()
if(s) w[++n]=s*a[i];
}f[0][0]=true;
for(int i=1;i<=n;++i){
for(int j=0;j觀察式子\(f[i][j]=max(f[i-1][j-c_i\;\times\;k]+w_i\;\times\;k)(0\;\leq\;k\;\leq\;m_i)\),
每乙個\(mod\;c_i\)的值相同的j可以用單調佇列進行優化.
bzoj1531
有\(n\)件物品和乙個容量為\(v\)的揹包.每種物品都有無限件可用,第i件物品體積為\(c_i\),價值為\(w_i\).求揹包最大價值.
\(f[i][j]\)表示前\(i\)種物品體積為\(j\)的最大價值.
\(f[i][j]=max(f[i-1][j-c_i\;\times\;k]+w_i\;\times\;k)\).
時間複雜度\(o(n^2v)\)
\(f[i][j]=max(f[i-1][j],f[i][j-c_i]+w_i)\).
bzoj1618
揹包問題學習筆記
有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。從這個題目中可以看出,01揹包的特點就是 每種物品僅有一件,可以選擇放或不放。01揹包問題的狀態轉移方程是 f i v max其中,即fi表示前i件物品恰放入乙個容量為v的揹包可以獲得的最...
揹包問題學習筆記
01揹包問題 題目描述 乙個人有乙個最大裝載質量為m的揹包。現在有n件物品,它們的質量分別是w1,w2,wn,它們的價值分別為c1,c2,cn。若每種物品只有一件,求這個人的揹包所能裝載的最大價值。輸入格式 第一行兩個整數m,n,如題中所述。第2行到第n 1行每行二個整數wi,ci,表示每個物品的重...
揹包問題學習筆記(1)
一方面學習揹包九講 這個十分清晰,重點標記清楚。但有些需要自己理解的和重點的,我做了如下筆記,方便別人理解,也方便自己複習,如有錯誤,歡迎指正。狀態函式f i v 表示 前i件物品放入容量為v的揹包可獲得的最大價值 狀態遷移方程f i v max考慮下為什麼是這樣的,對於第i件物品,我們只考慮是否要...