乙個旅行者有乙個最多能用$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。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第一行兩...