动态规划-找零钱问题

本文探讨了用动态规划和贪心算法解决找零钱问题的方法。通过实例展示了两种策略的计算过程,分析了各自的优势和适用场景。动态规划自底向上计算所有可能,而贪心法每次都选择最大面值硬币,但不保证全局最优解。

动态规划-找零钱问题

问题描述

如果我们有面值为1元、3元和5元的硬币若干枚

问题分析

11-5=6,当需要凑齐6元时,最少的硬币数量方案再加一个5元,就是11元的最佳方案。相当于6元方案再加一个五元硬币。
于是可以得出:
dp(0)=0
dp(1)=dp(1-1)+1=1
dp(2)=dp(2-1)+1=2
dp(3)=dp(3-3)+1=1
dp(4)=dp(4-3)+1=2
dp(5)=dp(5-5)+1=1
dp(6)=dp(6-5)+1=2
dp(7)=dp(7-5)+1=3
dp(8)=dp(8-5)+1=2
dp(9)=dp(9-5)+1=3
dp(10)=dp(10-5)+1=2
dp(11)=dp(11-5)+1=3

根据上述等式可以推理出:
dp(n)=dp(n-可用的最大面值) +1

方案一:

采用动态规划,自底向上计算,保留每一个结果。需要计算从1到11每一个金额的最小硬币方案。

代码:

    public static void main(String[] args) throws Exception {
        int[] types = {1,3,5};
        for(int i=0;i<=11;i++)
            exchange(i, types);
    }  
    
    public static void exchange(int money, int[] types) throws Exception {
        List<Integer> parValues = Ints.asList(types);
        
        List<Integer> reference = minResolve(money, parVal
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值