动态规划 找零钱问题

本文通过一个具体的找零问题示例说明了贪心算法存在的局限性,并提出使用动态规划来解决这类问题。文章给出了一个C++实现的动态规划算法代码,用于找出构成特定金额所需的最少货币单位。

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

这个用贪心的话 会出错 记录一下这个例子 比如金额是10块,面币为2 5 6 11 10 按照贪心的话 肯定选6和2张2,但是只要2张5块就可以了,因此贪心法会出现问题,所以,需要用动态规划,写出状态转移方程,遍历金额,随后里面套一个面币数量的循环,当遍历到当前金额的时候 只要当前金额减去当前面币值大于0 随后取这个后的最小和不取这个后的最小即可,可能语言组织不大好,直接上代码吧

#include <iostream>
using namespace std;
int main() {
    //硬币面值的数组
    int values[100];
    //要找零的数
    int money,size;
    //保存每个面值对应的最小值 因为0号位置要舍弃 因此要加1
    
    
    //输入总共有几种面值 和从小到大输入每种面值的大小
    cout<<"输入要找零的金额";
    cin>>money;
    cout<<"输入要面值的总数和种类";
    cin>>size;
    for(int i = 0; i < size; i++)
        cin >> values[i];
    int *coinsUsed = new int[money + 1];
    coinsUsed[0] = 0;
    //总共的钱数的遍历
    int mincoin = 0;
    for(int i = 1; i <= money; i++){
        mincoin = i;
        //总共有几种面值的遍历
        for (int j = 0; j < size; j++) {
            //如果当前第j中面值小于总共的钱数
            if(values[j] <= i){
                //用了这一面值 前提是用这张纸币的数量比不用这张纸币的数量小采用
               
                    mincoin = min(mincoin,coinsUsed[i - values[j]] + 1);
                
            }
        }
        //当前金额所需的最小纸张数
        coinsUsed[i] = mincoin;
        
        
    }
    cout<<"总共需要面币张数为"<<coinsUsed[money]<<endl;
    return 0;
}
http://blog.youkuaiyun.com/wdxin1322/article/details/9501163参考的博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值