采药问题 c语言程序,采药-动态规划题解(C语言代码)

一看到题就发现这是动态规划,题目要求最大获利之类的时候也一般想到动态规划,动态规划的题就是用空间换取时间,建立一个表存储需要重复计算的自问题,表的最后一项的值就是我们要求的最优值。

动态规划的题先分析需要求的最大值是什么,这道题是价值的最大值,而子问题就是草药种类以及时间量两方面不同情况下的最优解。

填表时先写好初始条件即无草药时,最大价值为0,无论时间为多少。

同理,无时间时,最大价值为0,无论草药种类。

填表时则需要考虑三个情况

一、拿得下草药时

1、不拿这个药(拿了药之后的剩余时间的最大值价值+这个药的最大价值比当前时间已算出的最大价值小)

2、拿这个药(拿了药之后的剩余时间的最大值价值+这个药的最大价值比当前时间已算出的最大价值大)

二、拿不下草药时

最大价值就等于假设没有这个草药时的最大价值,即之前的最大价值。

最后输出表中最后一个项即为最大价值

tip:代码中&显示似乎不太正确注意辨别

```c

#includeint main()

{

int t,m,dp[101][1001],cv[101],ct[101],i,j;

scanf("%d%d",&t,&m);

for(i=1;i<=m;i++){

scanf("%d%d",&ct[i],&cv[i]);

}//获取输入值并放在ct[]代表草药获取需要的时间

//cv[]代表草药价值

for(i=0;i<=m;i++){

dp[i][0]=0;

}

for(i=0;i<=t;i++){

dp[0][t]=0;

}//初始化边界值,无草药和无时间的情况

for(i=1;i<=m;i++){

for(j=1;j<=t;j++){

if(j>=ct[i]){

dp[i][j]=max(dp[i-1][j],cv[i]+dp[i-1][j-ct[i]]);

}

else{

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

}

}

}//填表

printf("%d",dp[m][t]);

return 0;

}

int max(int a,int b){//比较大小的函数(可替换,没啥大用)

if(a>b)

return a;

else

return b;

}

```

第一次写题解,如有错误希望大家见谅,如果感觉不清楚的可以看看《算法图解》,感觉上面解释得足够清楚

0.0分

5 人评分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值