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

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

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

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

相关推荐
C嘎嘎嵌入式开发1 分钟前
【机器学习算法篇】K-近邻算法
算法·机器学习·近邻算法
小L~~~2 分钟前
2025吉比特-游戏引擎开发-一面复盘
数据结构·算法·游戏引擎
程序猿Eason1 小时前
U587038 背包 题解
c++·算法·动态规划
potato_may1 小时前
第18讲:C语言内存函数
c语言·数据结构·算法
dingzd952 小时前
TikTok推荐算法快速解析
算法·机器学习·web3·facebook·推荐算法·tiktok·instagram
仰泳的熊猫2 小时前
LeetCode:95. 不同的二叉搜索树 II
数据结构·c++·算法·leetcode
Nix Lockhart2 小时前
《算法与数据结构》第七章[算法4]:最短路径
c语言·数据结构·学习·算法·图论
用户6605307619623 小时前
UFlow:像素级工业零件异常检测 Normalized Flow 方法
算法
爱吃烤鸡翅的酸菜鱼3 小时前
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
java·算法