[1261]采药-第一个成功的动态规划题

其实这个成功确实有点水,很多地方都有点一知半解的意味.不管,这篇文章也许还要改吧.
原题:
Description

辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”

如果你是辰辰,你能完成这个任务吗?

Input
输入文件medic.in的第一行有两个整数T(1 <= T <= 1000)和M(1 <= M <= 100),用一个空格隔开,T代表总共能够用来采药的时间,M代表山洞里的草药的数目。接下来的M行每行包括两个在1到100之间(包括1和100)的整数,分别表示采摘某株草药的时间和这株草药的价值。

Output
输出文件medic.out包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。

Sample Input
70 3
71 100
69 1
1 2
Sample Output
3
HINT

对于30%的数据,M <= 10;

对于全部的数据,M <= 100

代码:

#include<stdio.h>
int time[1000],val[1000],value[1000];
int main()
{
    int M,T;
    scanf("%d%d",&T,&M);
    for(int i=0;i<M;i++)
    scanf("%d%d",&time[i],&val[i]);
    for(int med=0;med<M;med++)
    {
        for(int i=T;i>0;i--)
        {
            if(time[med]<=i)
                if(val[med]+value[i-time[med]]>value[i])
                {
                    value[i]=val[med]+value[i-time[med]];
                }
        }
    }
    printf("%d\n",value[T]);
} 

思路:这个代码主要借鉴了另一个别人的代码的思路.主要思路是对于每种药进行一次循环,然后这次循环中计算出对于这种药在多少时间时能获得多少的最大价值.然后如此不断循环,最后得到的最后一项即是在T时间能获得的最大价值.
具体分析:

70 3
71 100
69 1
1 2
将value[70]=0设为val[1]+value[1]=1
将value[69]=0设为val[1]+value[0]=1
将value[70]=1设为val[2]+value[69]=3
将value[69]=1设为val[2]+value[68]=2
将value[68]=0设为val[2]+value[67]=2
将value[67]=0设为val[2]+value[66]=2
将value[66]=0设为val[2]+value[65]=2
将value[65]=0设为val[2]+value[64]=2
将value[64]=0设为val[2]+value[63]=2
将value[63]=0设为val[2]+value[62]=2
将value[62]=0设为val[2]+value[61]=2
将value[61]=0设为val[2]+value[60]=2
将value[60]=0设为val[2]+value[59]=2
将value[59]=0设为val[2]+value[58]=2
将value[58]=0设为val[2]+value[57]=2
将value[57]=0设为val[2]+value[56]=2
将value[56]=0设为val[2]+value[55]=2
将value[55]=0设为val[2]+value[54]=2
将value[54]=0设为val[2]+value[53]=2
将value[53]=0设为val[2]+value[52]=2
将value[52]=0设为val[2]+value[51]=2
将value[51]=0设为val[2]+value[50]=2
将value[50]=0设为val[2]+value[49]=2
将value[49]=0设为val[2]+value[48]=2
将value[48]=0设为val[2]+value[47]=2
将value[47]=0设为val[2]+value[46]=2
将value[46]=0设为val[2]+value[45]=2
将value[45]=0设为val[2]+value[44]=2
将value[44]=0设为val[2]+value[43]=2
将value[43]=0设为val[2]+value[42]=2
将value[42]=0设为val[2]+value[41]=2
将value[41]=0设为val[2]+value[40]=2
将value[40]=0设为val[2]+value[39]=2
将value[39]=0设为val[2]+value[38]=2
将value[38]=0设为val[2]+value[37]=2
将value[37]=0设为val[2]+value[36]=2
将value[36]=0设为val[2]+value[35]=2
将value[35]=0设为val[2]+value[34]=2
将value[34]=0设为val[2]+value[33]=2
将value[33]=0设为val[2]+value[32]=2
将value[32]=0设为val[2]+value[31]=2
将value[31]=0设为val[2]+value[30]=2
将value[30]=0设为val[2]+value[29]=2
将value[29]=0设为val[2]+value[28]=2
将value[28]=0设为val[2]+value[27]=2
将value[27]=0设为val[2]+value[26]=2
将value[26]=0设为val[2]+value[25]=2
将value[25]=0设为val[2]+value[24]=2
将value[24]=0设为val[2]+value[23]=2
将value[23]=0设为val[2]+value[22]=2
将value[22]=0设为val[2]+value[21]=2
将value[21]=0设为val[2]+value[20]=2
将value[20]=0设为val[2]+value[19]=2
将value[19]=0设为val[2]+value[18]=2
将value[18]=0设为val[2]+value[17]=2
将value[17]=0设为val[2]+value[16]=2
将value[16]=0设为val[2]+value[15]=2
将value[15]=0设为val[2]+value[14]=2
将value[14]=0设为val[2]+value[13]=2
将value[13]=0设为val[2]+value[12]=2
将value[12]=0设为val[2]+value[11]=2
将value[11]=0设为val[2]+value[10]=2
将value[10]=0设为val[2]+value[9]=2
将value[9]=0设为val[2]+value[8]=2
将value[8]=0设为val[2]+value[7]=2
将value[7]=0设为val[2]+value[6]=2
将value[6]=0设为val[2]+value[5]=2
将value[5]=0设为val[2]+value[4]=2
将value[4]=0设为val[2]+value[3]=2
将value[3]=0设为val[2]+value[2]=2
将value[2]=0设为val[2]+value[1]=2
将value[1]=0设为val[2]+value[0]=2
3

完整的输入,循环中的赋值过程.从中可以看出其运行的具体过程:先在第一次中,判断出对于药0可能的时间点:没有;第二次判断出对于药1可能的时间点:70和69,将其设置为药1的价值.第三次判断药2时发现:对于时间点70,若除去药2的时间i=1,剩下的时间所对应的最大价值会大于现在可能的最大价值,故将当前点的价值设为2的价值+1的价值.下文同理进行运算.最后在value[时间最大时]得到的就是最大可能价值.

也许我说的也不一定对吧…仅代表个人看法.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值