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

2022-05-15 19:19:34 字數 968 閱讀 2505

(點選此處檢視原題)

簡單來說,就是乙個完全揹包,不過這裡卡住了常規的完全揹包寫法,時間複雜度為o( v*∑( v/c[i] ))如下所示:

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

}}

解題思路

既然普通的寫法無法解決,那就採用如下的優化即可,時間複雜度為o(nv),題目滿足n*t <= 1e7,因此可以跑過去:

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

}

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define bug cout << "**********" << endl

#define show(x, y) cout<<"["<#define local = 1;

using

namespace

std;

typedef

long

long

ll;const

int inf = 1e9 + 7

;const ll mod = 1e9 + 7

;const

int max = 1e5 + 10

;int

t, n;

intcost[max],val[max];

int dp[max]; //

記錄**為i的時候的最大價值

intmain()

}printf(

"%d\n

",dp[t]);

return0;

}

P1616 瘋狂的採藥 DP 完全揹包

此題為紀念 liyuxiang 而生。liyuxiang 是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說 孩子,這個山洞裡有一些不同種類的草藥,採每一種都需要一些時間,每一種...

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

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

洛谷 P1616 瘋狂的採藥

題目概述 給定時間t,草藥數n,採每組草藥所需的時間a i 和該組草藥的價值b i 求在給定的時間內能採到的草藥的最大價值。每種草藥可以無限採。n 10000,且n t 10 7 解題思路 我們知道,對於這類揹包問題,時間複雜度為 n t 在題目所給的範圍內不會超時,方法與01揹包一致,不過掃瞄的順...