p1616 瘋狂的採藥
和01揹包相比,每種物品的數量變得無限了,但還是有乙個**條件,就是不能超過揹包總量的,假設取 k 件物品 i ,k * s[i] <= c,這樣就轉化成多重揹包了。
但是,在二維層面是很容易簡化的。
for
(i =
1; i <= n; i++
)}
j 這層迴圈,從小到大計算,那麼就有 f[p-v[i]] = f[i][p-v[i]] ,這樣的話,沒有記錄上次的狀態,也就是說,當作不知道物品 i 有沒有取,可以把它再放到揹包裡面,即無限數量了。
#include
//萬能標頭檔案
using
namespace std;
#define maxn 10000000
int f[maxn]=;
//簡化陣列, 只保留原來第二維, 即 f[j] 表示空間為 j 的時候最大的價值
int s[maxn]
,//空間
v[maxn]
;//價值
intmain()
for(i =
1; i <= n; i++)}
printf
("%d"
, f[c]);
return0;
}
P1616 瘋狂的採藥 (完全揹包優化)
點選此處檢視原題 簡單來說,就是乙個完全揹包,不過這裡卡住了常規的完全揹包寫法,時間複雜度為o v v c i 如下所示 for int i 1 i n i 解題思路 既然普通的寫法無法解決,那就採用如下的優化即可,時間複雜度為o nv 題目滿足n t 1e7,因此可以跑過去 for int i 1...
P1616 瘋狂的採藥 DP 完全揹包
此題為紀念 liyuxiang 而生。liyuxiang 是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說 孩子,這個山洞裡有一些不同種類的草藥,採每一種都需要一些時間,每一種...
luogu1616 瘋狂的採藥 完全揹包
知道時間 t 有n 株備選藥品,知道每件藥品的數量是無限的,採摘一株需要用時 v,價值 w 求 t 時間內,能採摘的最大價值的藥 用 i 表示當前可以放進箱子的物品總數量不等,因為每種藥可以拿多株,這是乙個似乎比3選x 更複雜的組合問題。題目要求知道最優狀態,所以可以忽略過程 降維分析,因為只考慮物...