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

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

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

贪心算法解决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元。

相关推荐
努力学算法的蒟蒻5 分钟前
day79(2.7)——leetcode面试经典150
算法·leetcode·职场和发展
2401_841495649 分钟前
【LeetCode刷题】二叉树的层序遍历
数据结构·python·算法·leetcode·二叉树··队列
AC赳赳老秦11 分钟前
2026国产算力新周期:DeepSeek实战适配英伟达H200,引领大模型训练效率跃升
大数据·前端·人工智能·算法·tidb·memcache·deepseek
2401_8414956436 分钟前
【LeetCode刷题】二叉树的直径
数据结构·python·算法·leetcode·二叉树··递归
budingxiaomoli36 分钟前
优选算法-字符串
算法
qq7422349841 小时前
APS系统与OR-Tools完全指南:智能排产与优化算法实战解析
人工智能·算法·工业·aps·排程
A尘埃1 小时前
超市购物篮关联分析与货架优化(Apriori算法)
算法
.小墨迹1 小时前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu
不穿格子的程序员2 小时前
从零开始刷算法——贪心篇1:跳跃游戏1 + 跳跃游戏2
算法·游戏·贪心
大江东去浪淘尽千古风流人物2 小时前
【SLAM新范式】几何主导=》几何+学习+语义+高效表示的融合
深度学习·算法·slam