认真专注坚持


私信TA

用户名:dotcpp0695321

访问量:261

签 名:

等  级
排  名 12664
经  验 962
参赛次数 0
文章发表 4
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

解题思路:

创建M行T列的二位数组,I行,j为0-T,为所有i行j时间下的赋value值,具体如下

j-time[i]是剩余可用时间,而上一层Sum_V[i - 1]记录了在i-1个草药下,所有T时间内所可得到的最大value值,Sum_V[i - 1][j - Time[i]]就是i个草药情况下剩余时间内可采的药的价值,加上第i层本身要采的,在比较上层同样时间j下的value值后,就是当层i个草药在j时间内的最大value值,直到j达到时间最大值T,就是新的一层i个草药下所有的value最大值,直到i达到最大草药值M,且每层最右边的元素就是i个元素总价值最大的(时间越多,value值肯定越大)


注意事项:

参考代码:

#include<stdio.h>

int Max(int a, int b)

{//获取最大数

   return a > b ? a : b;

}

int main()

{

   int T, M;//采药总时间  药草个数

   int i, j;//循环变量

   int Time[101] = { 0 }; //采药所需时间

   int Value[101] = { 0 };//药草价值

   //二维数组

   // M(1 <= M <= 100) T(1 <= T <= 1000)

   //Sum_V[M][T]

   int Sum_V[101][1001] = { 0 };//药草最大总价值

   scanf("%d%d", &T, &M);

   for (i = 1; i <= M; i++)

       scanf("%d%d", &Time[i], &Value[i]);

/***************核心代码(重点)**************/

   for (i = 1; i <= M; i++)

   {//循环 M 次

       for (j = 1; j <= T; j++)

       {

           if (j >= Time[i])//用上一行(i-1行)的值求本行(i行)的值

               Sum_V[i][j] = Max(Sum_V[i - 1][j], Sum_V[i - 1][j - Time[i]] + Value[i]);

           else//j < Time[i]时,将上一行(i-1行)的值传给下一行(i行)的数组

               Sum_V[i][j] = Sum_V[i - 1][j];

       }

   }

   printf("%d\n", Sum_V[M][T]);

   return 0;

}


 

0.0分

0 人评分

  评论区

  • «
  • »