(點選此處檢視原題)
簡單來說,就是乙個完全揹包,不過這裡卡住了常規的完全揹包寫法,時間複雜度為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揹包一致,不過掃瞄的順...