九度Oj 1123: 採藥
阿新 • • 發佈:2019-02-18
- 題目描述:
-
辰辰是個很有潛能、天資聰穎的孩子,他的夢想是稱為世界上最偉大的醫師。
為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了一個難題。
醫師把他帶到個到處都是草藥的山洞裡對他說:
“孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。
我會給你一段時間,在這段時間裡,你可以採到一些草藥。如果你是一個聰明的孩子,你應該可以讓採到的草藥的總價值最大。”
如果你是辰辰,你能完成這個任務嗎?
- 輸入:
-
輸入的第一行有兩個整數T(1 <= T <= 1000)和M(1 <= M <= 100),T代表總共能夠用來採藥的時間,M代表山洞裡的草藥的數目。
接下來的M行每行包括兩個在1到100之間(包括1和100)的的整數,分別表示採摘某株草藥的時間和這株草藥的價值。
- 輸出:
-
可能有多組測試資料,對於每組資料,
輸出只包括一行,這一行只包含一個整數,表示在規定的時間內,可以採到的草藥的最大總價值。
- 樣例輸入:
-
70 3 71 100 69 1 1 2
- 樣例輸出:
-
3
- 來源:
題目分析:
一道典型的01揹包問題,一般採用動態規劃解決。
原始碼1(空間複雜度為O(m*t))
#include <stdio.h> #include <stdlib.h> #include <string.h> //01揹包問題,時間複雜度O(m * t), 空間複雜度O(m * t) typedef struct Herbs //草藥結構體 { int time; int value; }Herbs; int max(int a, int b) { return a > b ? a : b; } int main() { int t, m; Herbs a[110]; int dp[110][1010]; while(scanf("%d%d", &t, &m) != EOF) { int i, j; for(i = 1; i <= m; i++) scanf("%d%d", &a[i].time, &a[i].value); memset(dp, 0, sizeof(int)*110*1010); //動態規劃陣列初始化 for(i = 1; i <= m; i++) //動態規劃 for(j = 0; j <= t; j++) { if(j < a[i].time) dp[i][j] = dp[i-1][j]; else dp[i][j] = max(dp[i-1][j - a[i].time] + a[i].value , dp[i-1][j]); //摘第i個草藥還是不摘呢 } printf("%d\n", dp[m][t]); } //system("pause"); return 0; } /************************************************************** Problem: 1123 User: superlc320 Language: C++ Result: Accepted Time:150 ms Memory:1384 kb ****************************************************************/
原始碼2(空間複雜度為O(t))
#include <stdio.h> #include <stdlib.h> #include <string.h> //01揹包問題,時間複雜度O(m * t), 空間複雜度O(t) typedef struct Herbs //草藥結構體 { int time; int value; }Herbs; int max(int a, int b) { return a > b ? a : b; } int main() { int t, m; Herbs a[110]; int dp[1010]; while(scanf("%d%d", &t, &m) != EOF) { int i, j; for(i = 0; i < m; i++) scanf("%d%d", &a[i].time, &a[i].value); memset(dp, 0, sizeof(int)*1010); //動態規劃陣列初始化 for(i = 0; i < m; i++) //動態規劃 for(j = t; j >= a[i].time; j--) //此處必須從大到小 dp[j] = max(dp[j - a[i].time] + a[i].value , dp[j]); //摘第i個草藥還是不摘呢 printf("%d\n", dp[t]); } //system("pause"); return 0; } /************************************************************** Problem: 1123 User: superlc320 Language: C++ Result: Accepted Time:90 ms Memory:1020 kb ****************************************************************/