动态规划只11硬币的问题

本文介绍了动态规划解决11分硬币问题的过程,重点在于找到正确的状态转移方程。通过外层循环遍历不同面值的硬币,并进行优化比较,最终得出最少数量的硬币组合。此外,作者分享了自己在思考问题时的心态调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

              修改于2016年5月8日  10:45,尽量让代码都有自己的习惯       

              刚接触动态规划的时候感觉很高端,但是做了以后啊还是那么大点事,也许什么事都那么回事,做了才知道,只有自己才清楚。其实在这个11硬币里面最主要的还是状态转移方程,只要这个方程找对了,实现起来也很容易,当进行到当前这一步,我总要和前一步进行比较,看这步是不是优化了,下面的外层循环遍历1,3,5,这个面值,然后里面在进行判断比较,这才是最关键的一步。很多问题类似,像背包问题。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main(int argc,char *argv[])
{
    int  i = 0;
    int  j = 0;
    int *d = NULL;       // 记录多少分的硬币需要的多少个
    const int sum = 11;
    int value[3] = {1,3,5};//硬币的面值
    
    d = (int *)malloc(sizeof(int) * (sum + 1));
    memset(d,0x00,sizeof(int)*(sum + 1));

    for(i = 0; i <= sum; i++){
        d[i] = i;    // 初始状态 只用一分硬币  
    }//end for

    for(i = 0; i < 3; i++){
        for(j = 0; j <= sum; j++){
            if(j >= value[i] && d[j] > d[j - value[i]]){//可以放下当前的硬币,并且用的面值比以前少
                d[j] = d[j - value[i]] + 1;  // 状态转移方程的核心一步
            }//end if
        }//end for 2
    }//end for 1


    for(i = 0; i <= sum; i++){
        printf("%d ",d[i]);
    }//end for

    return 0;
}          


 

      

                

 

结果如图所示,这是11分硬币的换的做少的解。

 

 

     今天中午真的很不爽,都没睡着,到底要以怎么的方式进行下去,我真的不知道了,本来想不通的问题我是不会去想的,不想因此而影响我的心情,就星期天的晚上,我不知道自己的感觉有没有错, 如果,,我发现 ,你对我说过的话,出尔反尔,我绝对就不理你,得不到就放弃吧,为什么还要拼命的争取,那样只会让自己伤痕累累,我也许是站在理性的角度,我会拿的起,放得下的,剩下的就看你,,

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值