Bootstrap

【算法】贪婪算法介绍及实现方法

贪婪算法简介

贪婪算法(Greedy Algorithm)是一种在每一步选择中都采取当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。贪婪算法通常用于解决优化问题,如最小化成本、最大化收益等。它并不保证得到最优解,但在很多问题中,它能产生很好的近似解或最优解。

贪婪算法的关键在于贪心选择性质:每一步所做的选择都是当前状态下的最优选择,并且这种选择不会依赖于子问题的解。

示例问题:找零钱问题

假设一个商店只销售价格为整数元的商品,并且只接受整数元的货币。给定一个商品的价格n元和一个无限数量的货币单位[1,2,5,10,20,50,100](分别代表1元、2元、5元、10元、20元、50元和100元),编写一个程序计算找零给顾客的最少货币数量。

C# 实现

using System;  
using System.Collections.Generic;  
  
class GreedyChangeMaker  
{  
    static List<int> denominations = new List<int> { 100, 50, 20, 10, 5, 2, 1 };  
  
    static int MakeChange(int amount)  
    {  
        int count = 0;  
        for (int i = 0; i < denominations.Count; i++)  
        {  
            while (amount >= denominations[i])  
            {  
                amount -= denominations[i];  
                count++;  
            }  
        }  
        return count;  
    }  
  
    static void Main()  
    {  
        int amount = 63;  
        Console.WriteLine($"Minimum number of coins required: {MakeChange(amount)}");  
    }  
}

C++ 实现

#include <iostream>  
#include <vector>  
using namespace std;  
  
int makeChange(int amount) {  
    vector<int> denominations = {100, 50, 20, 10, 5, 2, 1};  
    int count = 0;  
    for (int coin : denominations) {  
        while (amount >= coin) {  
            amount -= coin;  
            count++;  
        }  
    }  
    return count;  
}  
  
int main() {  
    int amount = 63;  
    cout << "Minimum number of coins required: " << makeChange(amount) << endl;  
    return 0;  
}

Python 实现

def make_change(amount):  
    denominations = [100, 50, 20, 10, 5, 2, 1]  
    count = 0  
    for coin in denominations:  
        count += amount // coin  
        amount %= coin  
    return count  
  
amount = 63  
print(f"Minimum number of coins required: {make_change(amount)}")

Java 实现

public class GreedyChangeMaker {  
    private static final int[] denominations = {100, 50, 20, 10, 5, 2, 1};  
  
    public static int makeChange(int amount) {  
        int count = 0;  
        for (int denomination : denominations) {  
            while (amount >= denomination) {  
                amount -= denomination;  
                count++;  
            }  
        }  
        return count;  
    }  
  
    public static void main(String[] args) {  
        int amount = 63;  
        System.out.println("Minimum number of coins required: " + makeChange(amount));  
    }  
}

;