动态规划法

最近遇到了一道挺有意思的算法题:四种硬币 1元3元4元5元  ,问:想要凑成n元钱最少几枚硬币?

public class CoinsGameMain {


    public static void main(String[] args) {
        int[] is = {1,3,4,5};
        fun(7,is);
    }

    public static void fun(int k, int[] is){
        int[] i1 = new int[99];
        for (int l=0;l<k+1;l++){
            if(l==0){
                i1[0] = 0;
            } else {
                int[] i2 = new int[4];
                for (int j=0;j<is.length;j++){
                    int ks = l - is[j];
                    if(ks >=0){
                        i2[j] = i1[ks]+1;
                    }
                }
                i1[l] = min(i2);
            }
            if (l==k){
                System.out.println((k)+":"+i1[l]);
            }
        }
    }

    private static int min(int[] i1){
        if (i1.length==0) return 0;
        int m = i1[0];
        for (int i=0;i<i1.length;i++){
            if(i1[i]!=0&&i1[i]<m){
                m=i1[i];
            }
        }
        return m;
    }

}

使用的是动态规划法,动态规划法的思路是:利用上一个结果的值来获取下一个结果没听起来很玄乎,用这道题举例,想要知道99元最少需要多少枚硬币的话,我需要知道:1元需要多少,2元需要多少,3元需要多少,4元...,最后才能知道99元需要多少。

算法思路

fun(n-1)+1,fun(n-3)+1,fun(n-4)+1,fun(n-5)+1之中最小的,已知fun(0)=0;

所以要想知道fun(99)=?,fun(0) fun(1) fun(2) ... fun(99)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值