問題描述: 辰辰是個天資聰穎的孩子,他的夢想是成爲世界上最偉大的醫師。爲此,他想拜附近最有威望的醫師爲師。醫師爲了判斷他的資質,給他出了一個難題。 醫師把他帶到一個處處都是草藥的山洞裏對他說:「孩子,這個山洞裏有一些不一樣的草藥,採每一株都須要一些時間,每一株也有它自身的價值。 我會給你一段時間,在這段時間裏,你能夠採到一些草藥。若是你是一個聰明的孩子,你應該能夠讓採到的草藥的總價值最大。」 若是你是辰辰,你能完成這個任務嗎? 輸入格式: 第一行有兩個整數 T(1 <= T <= 1000) 和 M(1 <= M <= 100),用一個空格隔開,T表明總共可以用來採藥的時間,M表明山洞裏的草藥的數目。 接下來的 M 行每行包括兩個在1到100之間(包括1和100)的整數,分別表示採摘某株草藥的時間和這株草藥的價值。 輸出格式: 包括一行,這一行只包含一個整數,表示在規定的時間內,能夠採到的草藥的最大總價值。 樣例輸入: 70 3 71 100 69 1 1 2 樣例輸出: 3 數據規模和約定: 對於30%的數據,M <= 10; 對於所有的數據,M <= 100。
例如:spa
#include<stdio.h> #include<stdlib.h> #include<memory.h> int dp(int m,int n); int main(void) { int m,n,Max_Value; scanf("%d %d",&m,&n); Max_Value = dp(m,n); printf("%d",Max_Value); return 0; } int dp(int m,int n) { int i,j; int *time = (int *)malloc((n+1) * sizeof(int)); int *value = (int *)malloc((n+1) * sizeof(int)); int *ans = (int *)malloc((m+1) * sizeof(int)); memset(time,0,(n+1) * sizeof(int)); memset(value,0,(n+1) * sizeof(int)); memset(ans,0,(m+1) * sizeof(int)); for(i = 1; i <= n; i++) { scanf("%d %d",&time[i],&value[i]); } for(i = 1; i <= n; i++) { for(j = m; j >= time[i]; j--) { if(ans[j - time[i]] + value[i] > ans[j]) { ans[j] = ans[j - time[i]] + value[i]; } } } return ans[m]; }