Java 求解零钱兑换

本文介绍了一道关于使用无限数量的硬币凑总金额的问题,将其归类为完全背包问题,并详细解释了解题思路。通过确定动态规划的dp数组、递推表达式、初始化状态和遍历顺序,给出了Java代码实现。最后,总结了利用动态规划解决此类问题的方法。
摘要由CSDN通过智能技术生成

一、题目

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

你可以认为每种硬币的数量是无限的。

在这里插入图片描述

二、完全背包解析

题目要求使用硬币凑总金额,每枚硬币可以使用多次,要求硬币个数最少,所以是完全背包问题,硬币个数最少是组合问题

(1)确定dp数组及下标含义

dp[j] 表示:总金额为 j 时,硬币最少是多少枚

(2)确定递推表达式

对于硬币 coins[i] 存在两种情况,要么放,要么不放,所以有:dp[j],dp[j-coins[i]]+1
所以要求硬币最少的情况为:Math.min(dp[j],dp[j-coins[i]]+1);

这里之所以执行加1操作,是因为这里是求得是硬币数目,如果是求组合个数则不加1,或者也可以认为和初始化时的情况有关

(3)确定初始化情况

dp[0]=0;表示当总金额为0时,需要0枚硬币
同时对于非零的情况初始化为无穷大,因为此时求最小

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南淮北安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值