揹包問題 完全揹包 P1616 瘋狂的採藥

2021-10-04 22:36:52 字數 687 閱讀 8034

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 更複雜的組合問題。題目要求知道最優狀態,所以可以忽略過程 降維分析,因為只考慮物...