P1616 瘋狂的採藥 DP 完全揹包

2022-09-12 03:27:06 字數 1122 閱讀 4534

此題為紀念 liyuxiang 而生。

liyuxiang 是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說:「孩子,這個山洞裡有一些不同種類的草藥,採每一種都需要一些時間,每一種也有它自身的價值。我會給你一段時間,在這段時間裡,你可以採到一些草藥。如果你是乙個聰明的孩子,你應該可以讓採到的草藥的總價值最大。」

如果你是 liyuxiang,你能完成這個任務嗎?

此題和原題的不同點:

11. 每種草藥可以無限制地瘋狂採摘。

22. 藥的種類眼花繚亂,採藥時間好長好長啊!師傅等得菊花都謝了!

輸入第一行有兩個整數,分別代表總共能夠用來採藥的時間 tt 和代表山洞裡的草藥的數目 mm。

第 22 到第 (m + 1)(m+1) 行,每行兩個整數,第 (i + 1)(i+1) 行的整數 a_i, b_iai​,bi​ 分別表示採摘第 ii 種草藥的時間和該草藥的價值。

輸出一行,這一行只包含乙個整數,表示在規定的時間內,可以採到的草藥的最大總價值。

輸入

70 3

71 100

69 1

1 2

輸出

140
資料規模與約定

這道題是一道完全揹包的模板題,其中要注意的是題目中的資料量給的比較大,因此最好使用滾動陣列對二維的dp陣列壓縮為一維的,詳細介紹請看這裡:動態規劃專題詳細總結(常見簡單型別)

#include#includeusing namespace std;

#define maxv 100010

#define maxn 10010

int m, t;

int dp[maxv];

int time[maxn], val[maxn];

int main()

for(int i = 1;i<=m;i++)

for (int j = time[i]; j <= t; j++)

printf("%d\n", dp[t]);

return 0;

}

P1616 瘋狂的採藥 (完全揹包優化)

點選此處檢視原題 簡單來說,就是乙個完全揹包,不過這裡卡住了常規的完全揹包寫法,時間複雜度為o v v c i 如下所示 for int i 1 i n i 解題思路 既然普通的寫法無法解決,那就採用如下的優化即可,時間複雜度為o nv 題目滿足n t 1e7,因此可以跑過去 for int i 1...

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

p1616 瘋狂的採藥 和01揹包相比,每種物品的數量變得無限了,但還是有乙個 條件,就是不能超過揹包總量的,假設取 k 件物品 i k s i c,這樣就轉化成多重揹包了。但是,在二維層面是很容易簡化的。for i 1 i n i j 這層迴圈,從小到大計算,那麼就有 f p v i f i p ...

洛谷P1616 瘋狂的採藥 基礎DP

題意 給t時間和m種草藥,每種草藥給出採摘用時及價值,每種都可以無限採摘,求出在給定時間可以得到的最多價值 思路 揹包問題,用dp思想很容易想到o t 的方法,轉移方程dp i max dp i dp i j dp j 就是用小於當前價值的所有時間求出當前時間的最大價值 include includ...