01揹包問題
有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。
第 i 件物品的體積是 vi,價值是 wi。
求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。
輸出最大價值。
輸入格式
第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。
接下來有 n 行,每行兩個整數 vi,wi,用空格隔開,分別表示第 i 件物品的體積和價值。
輸出格式
輸出乙個整數,表示最大價值。
資料範圍
0#include
#include
using
namespace std;
int dp[
10000
],c[
10000
],w[
10000
],v,n;
intmain()
cout<;}完全揹包問題
有 n 種物品和乙個容量是 v 的揹包,每種物品都有無限件可用。
第 i 種物品的體積是 vi,價值是 wi。
求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。
輸出最大價值。
輸入格式
第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。
接下來有 n 行,每行兩個整數 vi,wi,用空格隔開,分別表示第 i 種物品的體積和價值。
輸出格式
輸出乙個整數,表示最大價值。
資料範圍
0#include
#include
using
namespace std;
int dp[
10000
],c[
10000
],w[
10000
],v,n;
intmain()
cout<;}多重揹包問題:
樸素版:
#include
#include
using
namespace std;
int dp[
110]
,c[110
],w[
110]
,s[110
],v,n;
intmain()
cout<;}
優化版i(二進位制優化)
#include
using
namespace std;
const
int n=
12010
;// n=1000*log2000=1000*12, 揹包的個數
int n,m;
int v[n]
,w[n]
;int f[n]
;int
main()
if(s>0)
} n=cnt;
for(
int i=
1;i<=n;i++
)for
(int j=m; j>=v[i]
;j--
) f[j]
=max
(f[j]
, f[j-v[i]
]+w[i]);
cout<
}
分組揹包問題
有 n 組物品和乙個容量是 v 的揹包。
每組物品有若干個,同一組內的物品最多只能選乙個。
每件物品的體積是 vij,價值是 wij,其中 i 是組號,j 是組內編號。
求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大。
輸出最大價值。
輸入格式
第一行有兩個整數 n,v,用空格隔開,分別表示物品組數和揹包容量。
接下來有 n 組資料:
每組資料第一行有乙個整數 si,表示第 i 個物品組的物品數量;
每組資料接下來有 si 行,每行有兩個整數 vij,wij,用空格隔開,分別表示第 i 個物品組的第 j 個物品的體積和價值;
輸出格式
輸出乙個整數,表示最大價值。
資料範圍
0#include
#include
using
namespace std;
int dp[
1000
],v[
110]
,w[110];
intmain()
}}cout<;}
揹包問題模板
特點 每種物品只有一件 子問題定義狀態 bag i v 前i件物品放到乙個容量為v的揹包中可以獲得最大價值 轉移狀態方程 bag i v max bag i 1 v bag i 1 v weight i value i 模板 include include using namespace std i...
揹包問題模板
01揹包在時間複雜度上都是n n v 在這個基礎之上已經不能再進行優化了,在空間複雜度上,我們首先看一下複雜度為o n v 的程式 for int i 1 i n i for int j 0 j w j 但是我們還可以將空間複雜度壓縮為o v 我們會發現這裡每次更新第i層都只是看第i 1層,其他層的...
模板 揹包問題
include include define max a,b a b a b using namespace std const int n 1005 int n,v,v n w n int dp n voidf intmain f printf d n dp v return0 include i...