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