后端开发刷题 | 兑换零钱(动态规划)

描述

给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。

如果无解,请返回-1.

数据范围:数组大小满足0≤n≤10000 , 数组中每个数字都满足 0<val≤10000,0≤aim≤5000

要求:时间复杂度 O(n×aim),空间复杂度 O(aim)。

示例1

输入:

复制代码
[5,2,3],20

返回值:

复制代码
4

示例2

输入:

复制代码
[5,2,3],0

返回值:

复制代码
0

示例3

输入:

复制代码
[3,5],2

返回值:

复制代码
-1

思路分析:

  1. 初始化变量
    • Max = aim + 1:定义了一个全局最大值,用于初始化dp数组。这个值被设置为aim + 1,是因为如果dp数组中的某个值保持为Max,则表示无法用给定的硬币组成该金额。
    • dp = new int[aim + 1]:定义了一个dp数组,其中dp[i]表示组成金额i所需的最少硬币数。数组大小为aim + 1,因为需要包括目标金额本身。
    • Arrays.fill(dp, Max):将dp数组的所有元素初始化为Max,即无法组成该金额的状态。
    • dp[0] = 0:初始化dp数组的第一个元素为0,表示组成金额为0所需的最少硬币数为0。
  2. 动态规划过程
    • 外层循环遍历目标金额i(从1到aim),表示当前要尝试组成的金额。
    • 内层循环遍历硬币数组arr,检查每个硬币的面值。
    • 如果当前硬币的面值arr[j]小于等于当前要组成的金额i,则尝试使用这枚硬币。通过dp[i] = Math.min(dp[i], dp[i-arr[j]] + 1)更新dp[i]的值。这里dp[i-arr[j]] + 1表示使用了一枚面值为arr[j]的硬币后,还需要多少硬币来组成剩余的金额i-arr[j],然后加1表示当前使用的这枚硬币。
  3. 返回结果
    • 最后,dp[aim]存储了组成目标金额aim所需的最少硬币数。但是,如果dp[aim]仍然是初始化的Max值,说明无法用给定的硬币组成目标金额,因此返回-1。否则,返回dp[aim]

代码:

java 复制代码
import java.util.*;


public class Solution {
    /**
     
     * 最少货币数
     * @param arr int整型一维数组 the array
     * @param aim int整型 the target
     * @return int整型
     */
    public int minMoney (int[] arr, int aim) {
        //定义一个全局最大值
        int max=aim+1;
        int[] dp=new int[aim+1];
        Arrays.fill(dp,max);//初始化数组
        dp[0]=0;
        for(int i=1;i<=aim;i++){
            for(int j=0;j<arr.length;j++){
                if(arr[j]<=i){
                    dp[i]=Math.min(dp[i],dp[i-arr[j]]+1);
                }
            }
        }
        return dp[aim]>aim?-1:dp[aim];
    }
}
相关推荐
k09338 分钟前
sourceTree回滚版本到某次提交
开发语言·前端·javascript
激流丶15 分钟前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
神奇夜光杯16 分钟前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
Themberfue18 分钟前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
plmm烟酒僧20 分钟前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
测试界的酸菜鱼31 分钟前
Python 大数据展示屏实例
大数据·开发语言·python
小码农<^_^>33 分钟前
优选算法精品课--滑动窗口算法(一)
算法
让学习成为一种生活方式35 分钟前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
羊小猪~~35 分钟前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
晨曦_子画41 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin