混合揹包問題

2022-09-07 06:54:08 字數 1345 閱讀 6585

乙個旅行者有乙個最多能用$v$公斤的揹包,現在有$n$件物品,它們的重量分別是$w_1,w_2,...,w_n$,它們的價值分別為$c_1,c_2,...,c_n$。有的物品只可以取一次(01揹包),有的物品可以取無限次(完全揹包),有的物品可以取的次數有乙個上限(多重揹包)。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

輸入有多組資料,對於輸入每組資料的第一行:二個整數,$v$(揹包容量,$v\leqslant 200$),$n$(物品數量,$n\leqslant 200$);

第$2..n+1$行:每行三個整數$w_i,c_i,p_i$,前兩個整數分別表示每個物品的重量,價值,第三個整數若為$0$,則說明此物品可以購買無數件,若為其他數字,則為此物品可購買的最多件數($p_i$)。

對於每組輸入輸出僅一行,乙個數,表示最大總價值。

輸入

1032

1033

1454

輸出

11
首先判斷$p_i$是否等於$0$,如果等於,那麼就是完全揹包的板子,否則就是多重揹包的板子,最後$dp_v$即為答案,代表容量為$v$的揹包所能裝的最大價值

狀態轉移方程:

完全揹包或01揹包

多重揹包

#include #define enter puts("")

#define space putchar(' ')

#define maxn 2000100

#define inf 1e6

using

namespace

std;

typedef

long

long

ll;typedef

double

db;inline ll read()

while

(isdigit(ch))

if(las == '-'

) ans = -ans;

return

ans;

}inline

void

write(ll x)

if(x >= 10

) write(x / 10

); putchar(x % 10 + '0'

);}int weight[10001] , value[10001] , p[10001

];int dp[10001

];int

main()

write(dp[v]);

return0;

}/*10 3

2 1 0

3 3 1

4 5 4

11*/

混合揹包問題

如果將p01 p02 p03混合起來。也就是說,有的物品只可以取一次 01揹包 有的物品可以取無限次 完全揹包 有的物品可以取的次數有乙個上限 多重揹包 應該怎麼求解呢?考慮到在p01和p02中給出的偽 只有一處不同,故如果只有兩類物品 一類物品只能取一次,另一類物品可以取無限次,那麼只需在對每個物...

混合揹包問題

name 混合揹包問題 author 巧若拙 date 07 06 18 09 33 description 混合揹包問題 在n種物品中選取若干件放在容量為c的揹包裡,分別用p i 和w i 儲存第i種物品的價值和重量。有的物品只可以取一次 01揹包 有的物品可以取無限次 完全揹包 有的物品可以取的...

混合揹包問題

有 n 種物品和乙個容量是 v 的揹包。物品一共有三類 第一類物品只能用1次 01揹包 第二類物品可以用無限次 完全揹包 第三類物品最多只能用 si 次 多重揹包 每種體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第一行兩...