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

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

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

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

你可能感兴趣的:(算法)