揹包問題筆記(參考用)(板子?)

2021-10-10 16:10:48 字數 1703 閱讀 5836

/*0-1揹包:只許選擇一次 

問題:有n個物品和乙個容量為s的揹包,第i件物品的重量是w[i],價值是v[i]。在每種物品只許放一次,不可拆分,不超過揹包容量的前提下,問如何才能讓揹包的總價值最大。

f[i][j]=f[i-1][j-w[i]]+v[i]和f[i-1][j]的較大項*/

#include

#include

using

namespace std;

struct thingwant[30]

;long

long c[

10010

],d[

10010];

intmain()

for(

int i=

1;i<=m;i++)}

cout<

}/*完全揹包:物品數量選擇無限制

問題:有n個物品和乙個容量為s的揹包,第i件物品的重量是w[i],價值是v[i]。在每種物品有無限個,不可拆分,不超過揹包容量的前提下,問如何才能讓揹包的總價值最大。*/

#include

#include

using

namespace std;

struct thingwant[30]

;long

long c[

10010];

intmain()

for(

int i=

1;i<=m;i++)}

cout<

}/*多重揹包:物品數量有上限

有n個物品和乙個容量為s的揹包,第i件物品的重量是w[i],價值是v[i],上限是c[i]。在不可拆分,不超過揹包容量的前提下,問如何才能讓揹包的總價值最大。*/

#include

#include

using

namespace std;

struct thing want[30]

;long

long c[

10010];

intmain()

for(

int i=

1; i<=n; i++)}

}}

cout << c[m]

<< endl;

return0;

}/*混合揹包

有n個物品和乙個容量為s的揹包,第i件物品的重量是w[i],價值是v[i],上限是c[i](若為0則可取無限個)。在不可拆分,不超過揹包容量的前提下,問如何才能讓揹包的總價值最大。*/

#include

#include

using

namespace std;

struct thingwant[30]

;long

long c[

10010];

intmain()

for(

int i=

1;i<=m;i++)}

else}}

}}cout<

}//0-1揹包最優解

#include

#include

using

namespace std;

int n,s,f[

100]

,w,v;

intmain()

} cout<

}

揹包問題板子

在開始之前先說明幾個變數 dp max v max w max c max 分別代表dp陣列,重量,價值,多重揹包問題中物品的最大可取數量 將v和w的含義調換了一下,沒大問題 v,n表示揹包容量和物品種數 void zero one pack int vi,int wi void complete ...

揹包板子總結

01揹包 int v 揹包最大容量 int w max v max v為價值 w為重量 int dp max for i 1 i n i 完全揹包 int v 揹包最大容量 int w max v max v為價值 w為重量 int dp max for i 1 i n i 轉為01揹包 每件物品的...

01揹包 多重揹包 完全揹包板子

給你n種不同的物品,每個物品有自己的重量w i 和價值v i 如果每個物品只能拿一次,給你容量為m的揹包,怎樣才能取得最大價值?狀態轉移方程 dp j max 基本操作 for i 0 i for j m j w i j 01是從最大到當前 dp j max dp j dp j w i v i dp...