动态规划例子,凑硬币,支持各种硬币组合并打印组合详情

凑硬币是动态规划的一个经典例子,比如有硬币1,3,5,则组合出11有几种方案,最少硬币个数的有几种方案。

网上例子一般都是硬币组合1,3,5,如果不是1开头的就挂了,比如硬币组合是2,5,8,自己编写了支持所有硬币组合的代码。

有两个例子:

输出和等于target的最小个数硬币组合

/**
     * 输出和等于target的最小个数硬币组合
     * @param coins 硬币有哪几种,如{1,3,5}
     * @param target 硬币和等于多少,如13
     */
    private static void calcMinCoins(int [] coins, int target)

输出和等于target的所有硬币组合

/**
     * 输出和等于target的所有硬币组合
     * @param coins 硬币有哪几种,如{1,3,5}
     * @param target 硬币和等于多少,如13
     */
    private static void calcAllCoins(int [] coins, int target)

调用函数

public static void main(String[] args) {
        calcMinCoins(new int[]{2,5,8}, 50);
        calcAllCoins(new int[]{2,5,8}, 50);
    }

具体代码如下:

/**
     * 输出和等于target的最小个数硬币组合
     * @param coins 硬币有哪几种,如{1,3,5}
     * @param target 硬币和等于多少,如13
     */
    private static void calcMinCoins(int [] coins, int target) {
        Map map = new HashMap<>();
        for(int i=0;i<=target;i++){
            List listi = (List)map.get(i);//所有和等于i的组合
            if(listi == null){//若没有则初始化
                listi = new ArrayList();
                map.put(i,listi);
            }
            if(i == 0){//所有和等于0的组合是一个空组合
                listi.add(new ArrayList());
            }
            for(int coin : coins
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值