Vijos1104-採藥

Vijos1104-採藥

描述

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

輸入格式

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

輸出包括一行,這一行只包含一個整數,表示在規定的時間內,可以採到的草藥的最大總價值。
樣例1

樣例輸入1

70 3
71 100
69 1
1 2

樣例輸出1

3

限制

每個測試點1s

來源

NOIP2005普及組第三題

/*vijos1104 - dp
state definition: 對於dp[i][j],表示用了j時間時考慮到第i物品的最大價值
轉移方程:            
if (j - time[i] >= 0) dp[i][j] = max(dp[i - 1][j] 不取, 之前同一時間的結果, dp[i - 1][j - time[i]] + value[i] 取的結果,回退開銷時間的最佳值 + 該物品的值);
else dp[i][j] = dp[i - 1][j];
*/

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>


using namespace std;

int main(){
    int t, m;
    cin >> t >> m;
    int time[m + 1];
    int value[m + 1];
    for (int i = 1; i <= m; i++){
        cin >> time[i] >> value[i];
    }

    int dp[m + 1][t + 1];
    memset(dp, 0, sizeof(dp));
    for (int i = 1; i <= m; i++){
        for (int j = 0; j <= t; j++){
            if (j - time[i] >= 0) dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - time[i]] + value[i]);
            else dp[i][j] = dp[i - 1][j];
        }
    }

    cout << dp[m][t] << endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章