有 n 種物品和乙個容量是 v 的揹包。
第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。
求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。
輸出最大價值。
輸入格式
第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。
接下來有 n 行,每行三個整數 vi,wi,si,用空格隔開,分別表示第 i 種物品的體積、價值和數量。
輸出格式
輸出乙個整數,表示最大價值。
資料範圍
00輸入樣例45
1232
4134
3452
輸出樣例:
10
思路與其他揹包問題基本一樣,沒什麼區別,只不過加了一層for迴圈判斷
參考blog:
01揹包
完全揹包問題
s
陣列表示最多能裝多少次,c
表示裝多少次
c++ code:
#include
using
namespace std;
int f[
110]
[110];
int v[
110]
,w[110
],s[
110]
;int
main()
有 n 種物品和乙個容量是 v 的揹包。
第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。
求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。
輸出最大價值。
輸入格式
第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。
接下來有 n 行,每行三個整數 vi,wi,si,用空格隔開,分別表示第 i 種物品的體積、價值和數量。
輸出格式
輸出乙個整數,表示最大價值。
資料範圍
000本題考查多重揹包的二進位制優化方法。
輸入樣例45
1232
4134
3452
輸出樣例:
10
演算法: 揹包+二進位制優化
你們可以看到,這兩題唯一的區別就是資料大了不少
所以我們怎麼辦呢?
很容易想到,可以把s個物品拆成乙個個物品,變為01揹包,可是此時的時間複雜度為o(10^9)還是會超時
那末我們就把它拆成盡量少的物品
例如:
7 拆成 124
為什麼呢?應為1,2
,4可以用加法算出1
~7中所有的數1=
12=2
3=1+
24=4
5=1+
46=2
+47=
1+2+
4可以注意到:1=
2^02
=2^1
4=2^
2所以這題就簡單了,只有把每個物品按如上方式拆分就可以了
注意:這題要用到vector
其餘不懂的看注釋
c++ code:
#include
#include
using
namespace std;
const
int n=
2010
;int n,m;
int f[n]
;struct good
;int
main()
);}//拆分
if(s>
0) goods.
push_back()
;//如有剩餘,將其放入vector陣列中
}for
(auto good: goods)
//auto 是一種隨時改變的定義方式
for(
int j=m;j>=good.v;j--
) f[j]
=max
(f[j]
,f[j-good.v]
+good.w)
;//01揹包
cout<;//輸出最終解
return0;
}
DP 多重揹包問題模板
小明手裡有n元錢全部用來買書,書的 為10元,20元,50元,100元。問小明有多少種買書方案?每種書可購買多本 輸入格式 乙個整數 n,代表總共錢數。輸出格式 乙個整數,代表選擇方案種數。資料範圍 0 n 10000 n 1000 輸入樣例1 20輸出樣例1 2輸入樣例2 15輸出樣例2 0輸入樣...
多重揹包模板
有n種物品和乙個容量為v的揹包。第i種物品最多有num i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。多重揹包問題的思路跟完全揹包的思路非常類似,只是k的取值是有限制的,因為每件物品的數量是有限制的,狀態轉移方程為 dp i ...
多重揹包模板
多重揹包模板 1.多重揹包 優化 例題 有n種物品,每種物品的數量為c1,c2.cn。從中任選若干件放在容量為w的揹包裡,每種物品的體積為w1,w2.wn wi為整數 與之相對應的價值為p1,p2.pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物...