題意:給t時間和m種草藥,每種草藥給出採摘用時及價值,每種都可以無限採摘,求出在給定時間可以得到的最多價值
思路:揹包問題,用dp思想很容易想到o(t²)的方法,轉移方程dp[i]=max(dp[i],dp[i-j]+dp[j])
,就是用小於當前價值的所有時間求出當前時間的最大價值
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
const
int maxn =
1e6+10;
const
int mod =
1e9+7;
const
int inf =
0x3f3f3f3f
;int t, m, dp[maxn]
;int
main()
for(
int i =
0; i <= t; i++)}
printf
("%d\n"
, dp[t]);
}return0;
}
這種解法就算開o2優化也還有乙個用例tle,只能得86分,但揹包問題的正解還是下面這種,複雜度為o(mt)
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
const
int maxn =
1e6+10;
const
int mod =
1e9+7;
const
int inf =
0x3f3f3f3f
;int t, m, dp[maxn]
, t[maxn]
, val[maxn]
;int
main()
for(
int i =
0; i < m; i++)}
printf
("%d\n"
, dp[t]);
}return0;
}
洛谷 P1616 瘋狂的採藥
題目概述 給定時間t,草藥數n,採每組草藥所需的時間a i 和該組草藥的價值b i 求在給定的時間內能採到的草藥的最大價值。每種草藥可以無限採。n 10000,且n t 10 7 解題思路 我們知道,對於這類揹包問題,時間複雜度為 n t 在題目所給的範圍內不會超時,方法與01揹包一致,不過掃瞄的順...
洛谷P1616 瘋狂的採藥
完全揹包,可以用乙個常數優化,對於同乙個價值的量,僅儲存花費最小的那個就行了,因為每種都有無限多個。includeusing namespace std int n,v int c 10005 w 10005 int d 100005 int mincost 10005 pos void compl...
洛谷p1616瘋狂的採藥
這是個樸實無華的名字,所以下面是一篇樸實無華的文章,請大牛們輕噴 洛谷上這道題確實很瘋狂。其實這是一道完全揹包的板子題,但有兩點需要注意 所以,獻上第一次全wa includeusing namespace std int f 105 105 w 105 c 105 直接用的板子,陣列開的不夠大re...