動態規劃 洛谷P1616 瘋狂的採藥

2022-10-09 09:06:09 字數 1611 閱讀 3889

動態規劃 洛谷p1616 瘋狂的採藥

同樣也是洛谷的動態規劃乙個普及-的題目,接下來分享一下我做題**

看到題目,沒很認真的看資料大小,我就提交了我的**:

1

//動態規劃 洛谷p1616 瘋狂的採藥

2 #include3 #include4

using

namespace

std;

5int value[10005];//

價值陣列

6int times[10005];//

時間陣列

7int dp[10000003];//

t的範圍1e7

8int

main()916

//從小遍歷到大進行規劃 因為這題可以選無數個一樣的

17for (int i = 1; i <= t; ++i)

1825}26

}27 cout <

28return0;

2930 }

測試了幾個測試用例,過了 ,於是乎,我就自信滿滿的提交了!

但是!

仔細觀察資料大小,經典的沒開long long 

於是改正:

1

//動態規劃 洛谷p1616 瘋狂的採藥

2 #include3 #include4

using

namespace

std;

5int value[10005];//

價值陣列

6int times[10005];//

時間陣列

7long

long dp[10000003];//

t的範圍1e7 long long !!!!

8int

main()916

//從小遍歷到大進行規劃 因為這題可以選無數個一樣的

17for (int i = 1; i <= t; ++i)

1825}26

}27 cout <

28return0;

2930 }

然後!

結束啦!

總結歸納一下: 這題和p1048 

[noip2005 普及組] 採藥 非常像,只是資料加強了些,而且我們對比可以發現,還有乙個區別就是每個藥可以採摘無數次。

於是我們歸納出乙個模板,像只能採摘一次,也就是選擇一次的揹包問題,我們用採摘時間time值來做外層迴圈,反正每次只能選擇一次,也就是拿每種草藥的時間來遍歷.

//

也就是for(int i=1;i<=m;++i)

}

但是像這一題,每次可以選擇無數次,我們外層迴圈就只能用時間了,有點像選硬幣湊錢問題。從1一直遍歷到最大的time。內層去遍歷每一種草藥,因為可以採摘多次,得出我們的模板:

for (int i = 1; i <= t(最大時間); ++i)從小到大隊每乙個時間進行dp 算出每乙個時間的最優解}}

洛谷 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...