採藥(01揹包)

2021-09-10 05:06:51 字數 1632 閱讀 8994

fjut 2347

problem description

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

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

input

輸入檔案medic.in的第一行有兩個整數t(1 <= t <= 1000)和m(1 <= m <= 100),用乙個空格隔開,t代表總共能夠用來採藥的時間,m代表山洞裡的草藥的數目。接下來的m行每行包括兩個在1到100之間(包括1和100)的整數,分別表示採摘某株草藥的時間和這株草藥的價值。

output

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

sampleinput

70 3

71 100

69 1

1 2sampleoutput

3經典的揹包問題,dp解決。當然也可以暴力 暴力是萬能的 但會tle。

首先開兩個陣列 time【i】,weight【i】 採每種藥需要的時間和他的重量。。

然後對於每種藥 我們有兩個選擇,可以採也可以不採,前提是看採這個藥的時間是否小於等於剩餘時間 是的話在選擇,既然要最大值,肯定是要價效比高的了。這樣的話我們定義乙個二維陣列dp【i】【j】 表示前i個藥花費j時間所放的最大重量。。

如果time【i】>剩餘的時間 那麼dp【i】【j】就等於dp【i-1】【j】

那麼如果time【i】<=剩餘的時間,就可以選擇weight放或者不放,那麼怎麼判斷放不放呢

就是狀態轉移方程

dp【i】【j】=max( dp【i-1】【j】, dp【i-1】【j-time【i】】+weight【i】) )

將當前這個藥所需要花的時間減去 在加上當前藥的價值看是不是比不採當前藥的重量大,是就採,不是就不採。

最後的結果就是dp【藥的個數】【總共時間】

**如下

#include

using namespace std;

typedef

long

long ll;

ll dp[

105]

[1005];

intmain()

}}cout<[t];

}

複雜度是o(n*m)。

這裡介紹一下 用一維陣列dp的空間優化,dp【i】【j】是由dp【i-1】【j】得到而來的,所以我們可以把dp作為存重量的陣列即可,而i每一次都進行迭代就行。

附上**

#include

using namespace std;

intmain()

,v[1005

],w[

1005

],i,j;

for(i=

0;i) cin>>w[i]

>>v[i]

;for

(i=0

;i) cout<;}

採藥 01揹包

from silence 採藥 背景 background noip2005複賽普及組第三題 描述 description 辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說...

採藥(0 1揹包)

題目描述 辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說 孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裡...

01揹包 採藥

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