算法通关村第十七关——柠檬水找零

贪心,顾名思义,就是挑价值最大的

如果直接挑价值最大的,这样不一定能够达到最优解,因为最终价值多少还要取决于背包容量。

贪心算法解决0-1背包问题的基本思路是:按照物品的单位价值(即价值与重量的比值)从高到低进行排序,然后依次选择单位价值最高的物品放入背包,直到背包装满或者所有物品都已经被考虑过。

具体步骤如下:

  1. 首先,我们需要将所有的物品按照单位价值进行排序。单位价值最高的物品排在最前面。

  2. 然后,我们从单位价值最高的物品开始,依次考虑是否将其放入背包。如果当前物品的重量加上已经放入背包的物品的总重量不超过背包的容量,那么我们就将其放入背包。

  3. 如果当前物品的重量加上已经放入背包的物品的总重量超过了背包的容量,那么我们就放弃放入这个物品。

  4. 重复上述步骤,直到背包装满或者所有物品都已经被考虑过。

这种方法的优点是简单易懂,计算速度快。但是,它只能得到问题的局部最优解,不能保证得到全局最优解。

这也是贪心的典型题目之一,先看题目要求:LeetCode860,在柠檬水摊上,每一杯柠檬水的售价为5美元。顾客排队购买你的产品,(按账单bills支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付5美元、10美元或20美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付5美元。

输入:bi11s=[5,5,5,10,20]

输出:true

复制代码
public boolean lemonadeChange(int[] bills) {
    // 这里只表示5元和10元纸币的数量,而不是总金额
    int cash_5 = 0;
    int cash_10 = 0;
    for (int i = 0; i < bills.length; i++) {
        if (bills[i] == 5) {
            cash_5++;
        } else if (bills[i] == 10) {
            cash_5--;
            cash_10++;
        } else if (bills[i] == 20) {
            if (cash_10 > 0) {
                cash_10--;
                cash_5--;
            } else {
                cash_5 -= 3;
            }
        }
        if (cash_5 < 0 || cash_10 < 0) return false;
    }
    return true;
}
  • 1.如果给的是5,那么直接收下。

  • 2.如果给的是10元,那么收下一个10,给出一个5,此时必须要有一个5才行。

  • 3.如果给的是20,那么优先消耗一个10元,再给一个5元。假如没有10元,则给出3个5元。

相关推荐
王老师青少年编程4 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
叼烟扛炮5 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
天疆说5 小时前
【哈密顿力学】深入解读航天器交会最优控制中的Hamilton函数
人工智能·算法·机器学习
wuweijianlove6 小时前
关于算法设计中的代价函数优化与约束求解的技术7
算法
leoufung6 小时前
LeetCode 149: Max Points on a Line - 解题思路详解
算法·leetcode·职场和发展
样例过了就是过了6 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
HXDGCL6 小时前
矩形环形导轨:自动化循环线的核心运动单元解析
运维·算法·自动化
谭欣辰6 小时前
C++ 排列组合完整指南
开发语言·c++·算法
代码中介商7 小时前
银行管理系统的业务血肉 —— 流程、状态机、输入校验与持久化(下篇)
c语言·算法
foundbug9997 小时前
自适应滤除直达波干扰的MATLAB实现
开发语言·算法·matlab