動態規劃題目
辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了一個難題。醫師把他帶到一個到處都是草藥的山洞里對他說:“孩子,這個山洞里有一些不同的草藥,采每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間里,你可以采到一些草藥。如果你是一個聰明的孩子,你應該可以讓采到的草藥的總價值最大。”? 如果你是辰辰,你能完成這個任務嗎?
輸入文件medic.in的第一行有兩個整數T(1? < =? T? < =? 1000)和M(1? < =? M? < =? 100),用一個空格隔開,T代表總共能夠用來采藥的時間,M代表山洞里的草藥的數目。接下來的M行每行包括兩個在1到100之間(包括1和100)的整數,分別表示采摘某株草藥的時間和這株草藥的價值。
輸出文件medic.out包括一行,這一行只包含一個整數,表示在規定的時間內,可以采到的草藥的最大總價值。
對于30%的數據,M? < =? 10;對于全部的數據,M? < =? 100。
樣例輸入
70 3
71 100
69 1
1 2
樣例輸出
3
解析
從題目來看,是一道經典的01背包問題的題型,我們定義一個數組dp[n],代表花費時間n所能獲得的最大價值,初始值為0
當每輸入一個草藥,會從最大時間開始判斷,采草藥和不采草藥的收益大小,從而選擇最大收益的保存下來
例如dp[20]=100,代表當前花費20秒采草藥最大收益是100元
當出現新的一種草藥10 50,即出現一種花費10秒可以采集的草藥,這種草藥價值50元,這時候我們要不要采呢?
如果不采dp[20]肯定不變,還是等于100
如果采的話,dp[20]=dp[20-10]+50,也就是說必須騰出10秒的時間采這個草藥,所以用當前花費10秒采集其他草藥的最大收益 dp[10] 加上花費10秒采這顆草藥的收益 50,然后判斷是否比100大,如果比100大,就采,否則不采,這就是背包問題的算法
代碼
const int MAX_N=1000;
int dp[MAX_N+5]={0};
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
int main()
{
int T,M;
scanf("%d %d",&T,&M);
while(M--)
{
int time,price;
scanf("%d %d",&time,&price);
for(int i=T;i>=time;i--)
{
dp[i]=max(dp[i],dp[i-time]+price);
}
}
printf("%d\n",dp[T]);
return 0;
}