學習筆記 揹包問題

2022-05-31 04:48:10 字數 2360 閱讀 5015

有\(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

設有\(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

多重揹包二進位制拆分+注意輸出格式。

#include#include#include#include#include#include#include#include#include#include#define n 105

#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件物品,我們只考慮是否要...