首页 > 编程语言 >贪心算法案例 - 零钱兑换问题

贪心算法案例 - 零钱兑换问题

时间:2024-10-13 11:22:09浏览次数:1  
标签:硬币 int coins 零钱 算法 coin remainder 贪心

贪心算法案例 - 零钱兑换问题

贪心算法原则:

  1. 每一次都选取当前最优解
  2. 《向前看,别回头》

案例:(322. 零钱兑换 - 力扣(LeetCode))

题目描述:

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1

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

注意,局部最优解并不能保证全局最优解!

如下面的例子:

  1. 示例1

coins {15, 10, 1}

总金额21的情况下:

1*15 + 6*1 = 21 ==> 7个硬币(贪心思路)

2*10 + 1*1 = 21 => 3个硬币(实际最优解)

  1. 示例2

coins {15, 10}

总金额为20的情况下:

1*15 + ? ==> 无解(贪心思路)

2*10 = 20 ==> 实际情况有解

使用贪心的思想求解零钱兑换问题

public int coinChange(int[] coins, int amount) {
        // 每次循环时找到当前最优解: 面值最大的硬币,它凑出的硬币数最小
        int remainder = amount;  // 记录剩余金额
        int count = 0;  // 记录硬币的数量
        // 将硬币中的面值由大到小排序,确保每次拿到的都是当前最大面值的硬币!

        /**
         * 注意这里为什么在while循环条件里不写 >= ,
         *  条件刚好是 remainder = coin表示刚好凑够,此时本应该跳出循环了,
         *  但是remainder >= coin 该条件都成立时都会跳出循环,逻辑上是有问题的,
         *  因此把 remainder = coin 这个条件单独拿出来做退出操作
         *
         *  for (int coin : coins) {
         *             while (remainder >= coin) { // 剩余金额 > 最大金额
         *                 remainder -= coin;
         *                 count++;
         *                 // 此处的break只会退出while循环,并不会退出for循环,需要特别注意
         *                 // 如果此时条件 remainder = coin 其实也可以,只是会造成后面的for循环遍历部分空转,但不推荐这样写
         *                 break;
         *             }
         *         }
         *
         */
        for (int coin : coins) {
            while (remainder > coin) { // 剩余金额 > 最大金额
                remainder -= coin;
                count++;
            }

            // 剩余金额 = 当前硬币面值 ==> 需要退出整个for循环
            if (remainder == coin) {
                remainder = 0;
                count++;
                break;
            }
        }

        // 整个循环结束后还没凑够
        if (remainder > 1) {
            return -1;
        }
        return count;
    }

标签:硬币,int,coins,零钱,算法,coin,remainder,贪心
From: https://www.cnblogs.com/lilyflower/p/18462037

相关文章

  • 数字逻辑电路中的逻辑运算法则
    数字逻辑电路中的逻辑运算法则在数字逻辑电路中,逻辑运算是其核心。通过不同的逻辑运算,电路能够执行复杂的计算任务。本文将介绍几种基本的逻辑运算及其规则:与(AND)、或(OR)、非(NOT)、与非(NAND)、或非(NOR)、异或(XOR)和同或(XNOR),并结合C++和Verilog中的运算符号进行讲解。1.与(AND)运算与......
  • 数据结构与算法Python版p26-p28 无序表链表实现、有序表
    B站视频-数据结构与算法Python版无序表链表实现、有序表一、节点二、无序表三、有序表一、节点#节点classNode:def__init__(self,initdata):self.data=initdataself.next=NonedefgetData(self):returnself.data......
  • 算法||基于SSM的绿色食品推荐的设计与实现
    ......
  • 第108天:免杀对抗-Python&混淆算法&反序列化&打包生成器&Py2exe&Nuitka
    知识点#知识点:1、Python-对执行代码做文章2、Python-对shellcode做文章3、Python-对代码打包器做文章#章节点:编译代码面-ShellCode-混淆编译代码面-编辑执行器-编写编译代码面-分离加载器-编写程序文件面-特征码定位-修改程序文件面-加壳花指令-资源代码加载面-Dll反......
  • 机器学习主成分分析算法 PCA—python详细代码解析(sklearn)
    一、问题背景在进行数据分析时,我们常常会遇到这样的情况:各个特征变量之间存在较多的信息重叠,也就是相关性比较强。就好比在研究一个班级学生的学习情况时,可能会收集到学生的语文成绩、数学成绩、英语成绩等多个特征变量。但往往会发现,语文成绩好的学生,数学和英语成绩也可能比......
  • 107-免杀对抗-C&C++&溯源ShellCode上线&混淆变异算法&回调编译执行
    知识点#知识点:1、ShellCode-分析&朔源&感知2、ShellCode-混淆&编码&算法3、回调执行解析-API&汇编&句柄#章节点:编译代码面-ShellCode-混淆编译代码面-编辑执行器-编写编译代码面-分离加载器-编写程序文件面-特征码定位-修改程序文件面-加壳花指令-资源代码加载面-Dll......
  • YOLOv11全网最新创新点改进系列:一文读懂YOLOv11算法!!!
    YOLOv11全网最新创新点改进系列:免费送!!!改进且跑通的源码!!融入CBAM注意力,将通道注意力和空间注意力相结合,嘎嘎提升V11算法,叫叫首,改进速度遥遥领先,粉丝水文速度遥遥领先!!!所有改进代码均经过实验测试跑通!截止发稿时YOLOv11已改进40+!自己排列组合2-4种后,考虑位置不同后可排列组合......
  • Leetcode 贪心算法之 Container With Most Water
    题目描述给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。示例:输入:[1,8,6,2,5,4,8,3,7]输......
  • Leetcode 贪心算法之Jump Game II
    题目描述给定一个长度为n的0索引整数数组nums。初始位置为nums[0]。每个元素nums[i]表示从索引i向前跳转的最大长度。换句话说,如果你在nums[i]处,你可以跳转到任意nums[i+j]处:0<=j<=nums[i]i+j<n返回到达nums[n-1]的最小跳跃次数。生成的......
  • 代码随想录算法训练营 | 322. 零钱兑换,279.完全平方数,139.单词拆分
    322.零钱兑换题目链接:322.零钱兑换文档讲解︰代码随想录(programmercarl.com)视频讲解︰零钱兑换日期:2024-10-12想法:完全背包,注意初始化除dp[0]外都要置为Integer.MAX_VALUE,才能后面选出最小值,还有判断dp[j-coins[i]]!=Integer.MAX_VALUE,不成立的化代表除去coins[i]后,没有......