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

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

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

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

相关推荐
罗西的思考18 小时前
【Agent OS / AIOS】AOHP 深度解读:当 OS 开始为 Agent 而设计
人工智能·算法·机器学习
民乐团扒谱机19 小时前
【微实验】组合优化matlab实战(马科维茨投资模型):在收益与风险之间,寻找最优的人生配比
大数据·人工智能·算法·机器学习·数学建模·matlab·组合优化
Nil20819 小时前
leetcode 160相交链表
算法·leetcode·链表
迷途之人不知返20 小时前
算法系列2:滑动窗口
算法
Herbert_hwt21 小时前
C语言零基础入门:循环控制与数据类型详解
c语言·数据结构·算法
Tisfy1 天前
LeetCode 3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口
算法·leetcode·字符串·题解·模拟·双指针·滑动窗口
-dzk-1 天前
【技巧】LC 136.只出现一次的数字
算法·异或
有点。1 天前
C++二叉树二(练习题)
数据结构·c++·算法·图论
专注仿真1 天前
问答大模型技术方案算法实现-RAPTOR树构建算法与BEG集成使用
python·算法
zlinear数据采集卡1 天前
数据采集卡从入门到精通(10):采样率与分辨率的核心关系——反比律、架构分布与过采样
arm开发·嵌入式硬件·算法·fpga开发·架构·开源