85、动态规划-零钱兑换

news/2024/12/22 20:08:28/

思路:

还是老样子,还是先使用递归方式来解,然后通过递归推动态规划。那递归如何设计?

定义一个递归方法:表示从index开始到N达到剩下的值(目标值减去上一步的值)做少可以得到数量是多少。int process(int[] coins, int index, int rest)。代码如下:

java">public static int coinChange(int[] coins, int amount) {// 如果硬币数组为空或长度为0,则无法进行兑换,返回-1if (coins == null || coins.length == 0) {return -1;}// 调用递归函数计算最少硬币数int result = process(coins, 0, amount);// 如果结果是Integer.MAX_VALUE,说明没有找到有效组合,返回-1return result == Integer.MAX_VALUE ? -1 : result;
}private static int process(int[] coins, int index, int rest) {// 如果剩余金额为0,说明找到了一个有效的硬币组合,返回0(不需要更多硬币)if (rest == 0) {return 0;}// 如果硬币数组已经全部考虑完毕,或者剩余金额小于0,则当前路径不可行,返回Integer.MAX_VALUEif (index == coins.length || rest < 0) {return Integer.MAX_VALUE;}// 当前考虑的硬币int coin = coins[index];// 最多可以使用当前硬币的次数int zhang = rest / coin;// 初始化最小硬币数为最大整数,方便后面取最小值int min = Integer.MAX_VALUE;// 遍历每个可能的硬币数,从0开始到zhangfor (int i = 0; i <= zhang; i++) {// 递归调用,计算使用下一个硬币种类时的结果int next = process(coins, index + 1, rest - coin * i);// 如果next不是Integer.MAX_VALUE,更新最小硬币数if (next != Integer.MAX_VALUE) {min = Math.min(min, i + next);}}// 返回找到的最小硬币数return min;
}

首先获取index下对应的值:coin=coins[index]   然后确定当前值最优可以用几张:zhang=rest/coin

然后设置一个最小值min;开始循环,如果使用当前值i张,那么一共需要多少张零钱。然后求一个最小值。最后返回min;

这里涉及到重复计算,比如数组 coins = [1, 2, 5], amount = 11

重复计算的例子:

  • 剩余金额为10时
    • 可能通过使用0个1元硬币后使用5个2元硬币到达,也可能通过使用10个1元硬币直接到达,都会调用 process(coins, 2, 10)
  • 剩余金额为9时
    • 可以通过使用1个1元硬币后使用4个2元硬币到达,或者通过9个1元硬币到达,都会调用 process(coins, 2, 9)
  • 剩余金额为5时
    • 可以通过使用1个5元硬币直接到达,或者使用5个1元硬币,或者使用3个1元硬币后使用1个2元硬币到达,这些都会重复调用 process(coins, 2, 5)

所以我们可以使用动态规划来解,首先对于这种稍微服务在可以的画一个表格:

行:表示可以使用的元素   列:目标值是多少

dp[i][j]:表示对于数组中的元素从0到i可以用 得到j最少多少张。表格如下:

01234567891011
101234567891011
2011223344556
5011221223323

找规律:对于dp[i][j]是不使用当前值 nums[i] 达到小还是使用当前值dp[i][j-nums[i]+1 小谁小要谁。

代码如下:

java">public static int coinChange(int[] coins, int amount) {if (coins == null || coins.length == 0) {return -1;}int N = coins.length;int[][] dp = new int[N][amount + 1];// dp[i][j] 表示在下标 0-i这个数组里面 最少需要多少张可以组成j// dp[i][0]==0 java 默认 不用写// 计算dp[0][j] 表示只有一个数的 最少有多少种张组成 那就是能否整除for (int i = 1; i <= amount; i++) {if (i % coins[0] == 0) {dp[0][i] = i / coins[0];} else {dp[0][i] = -1;}}//for (int i = 1; i < N; i++) {for (int j = 1; j <= amount; j++) {dp[i][j] = Integer.MAX_VALUE;if (dp[i - 1][j] != -1) {dp[i][j] = dp[i - 1][j];}if (j - coins[i] >= 0 && dp[i][j - coins[i]] != -1) {dp[i][j] = Math.min(dp[i][j], dp[i][j - coins[i]]+1);}if (dp[i][j] == Integer.MAX_VALUE) {dp[i][j] = -1;}}}return dp[N - 1][amount];}


http://www.ppmy.cn/news/1452746.html

相关文章

【Linux】进程的隔离和控制:namespace 隔离、cgroup 控制

文章目录 五、namespace 隔离dd -- 读取、转换并输出数据mkfs -- 格式化文件系统df -- 显示文件系统磁盘使用情况mount -- 加载文件系统到指定的加载点unshare -- 创建子进程&#xff0c;同时与父程序不共享namespace一个 demo 六、cgroup(Control Group) 相关命令pidstat -- 监…

Python实战开发及案例分析(2)——单目标优化

在Python中&#xff0c;进行单目标优化主要涉及定义一个优化问题&#xff0c;包括一个目标函数和可能的约束条件&#xff0c;然后选择合适的算法来求解。Python提供了多种库&#xff0c;如SciPy、Pyomo、GEKKO等&#xff0c;用于处理各种优化问题。 案例分析&#xff1a;使用 …

JavaScript 中 ES6

在ES6&#xff08;ECMAScript 2015&#xff09;中&#xff0c;JavaScript引入了一些新的语法和特性来支持面向对象编程&#xff08;OOP&#xff09;。下面是对ES6中面向对象编程的详细解释&#xff1a; 类&#xff08;Class&#xff09;&#xff1a; ES6引入了类的概念&#xf…

vue3 vite 路由去中心化(modules文件夹自动导入router)

通过路由去中心化可实现多人写作开发&#xff0c;不怕文件不停修改导致的冲突&#xff0c;modules中的文件可自动导入到index.js中 // 自动导入模块 const files import.meta.globEager(./modules/**.js); const modules {} for (const key in files) {modules[key.replace…

Android使用kts发布aar到JitPack仓库

Android使用kts发布aar到JitPack 之前做过sdk开发&#xff0c;需要将仓库上传到maven、JitPack或JCenter,但是JCenter已停止维护&#xff0c;本文是讲解上传到JitPack的方式,使用KTS语法&#xff0c;记录使用过程中遇到的一些坑.相信Groovy的方式是大家经常使用的&#xff0c;…

c++实战篇(三) ——对socket通讯服务端与客户端的封装

前言 在前面几篇文章中我们介绍过一些有关于网络编程的相关知识,我们介绍了在tcp传输数据的时候发送缓冲区与接收缓冲区&#xff0c;我们介绍了在tcp发送与接收的过程中可能出现的分包与粘包的问题&#xff1a; c理论篇(一) ——浅谈tcp缓存与tcp的分包与粘包 我们介绍了在网络…

使用Qt for android 获取android PDA设备扫码数据

安装Qt Android 模块、Qt Creator、JDK8 Qt Creator版本太高不行&#xff0c;亲测最新版的会导致无法使用jdk 8&#xff08;2024-05-04 我的Qt版本是5.15.2&#xff0c;所以我选择了Qt Creator5.0.3进行开发 5.0.3 下载JDK8 JDK8 安装Qt Creator、JDK8 安装Qt Creator没什么…

SharedPreferences源码解析

前言 文章中部分地方SharedPreferences会简写成SP&#xff0c;先抛出几个问题&#xff1a; SP存储的是什么文件&#xff0c;存储在哪个位置&#xff1f;SP是线程安全的吗&#xff1f;SP是如何保证数据安全的&#xff1f;使用SP有哪些问题&#xff1f;SP会把数据加载到内存中吗…