藍橋杯之入學考試

  
問題描述:
  辰辰是個天資聰穎的孩子,他的夢想是成爲世界上最偉大的醫師。爲此,他想拜附近最有威望的醫師爲師。醫師爲了判斷他的資質,給他出了一個難題。
   醫師把他帶到一個處處都是草藥的山洞裏對他說:「孩子,這個山洞裏有一些不一樣的草藥,採每一株都須要一些時間,每一株也有它自身的價值。
   我會給你一段時間,在這段時間裏,你能夠採到一些草藥。若是你是一個聰明的孩子,你應該能夠讓採到的草藥的總價值最大。」
  若是你是辰辰,你能完成這個任務嗎?
輸入格式:
  第一行有兩個整數 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];
}
相關文章
相關標籤/搜索