跳至主要內容

3.1 贪心算法


贪心算法是一种常见的解决优化问题的方法,通过每步选择当前看起来最优的选择,希望得到全局最优解。下面我将提供一些使用 Java 实现的贪心算法示例,这些示例涵盖了不同的问题类型。

示例 1: 钱币找零问题

这个例子是经典的贪心算法应用。假设你是一名售货员,需要给客户找零。有若干不同面值的硬币,目标是使用最少数量的硬币完成找零。

import java.util.Arrays;

public class ChangeMaking {

    public static void findMinCoins(int[] coins, int amount) {
        Arrays.sort(coins); // 确保硬币是排序的
        int index = coins.length - 1;
        while (amount > 0) {
            int coinCount = amount / coins[index]; // 使用尽可能多的当前最大面额
            amount = amount % coins[index]; // 更新余额
            if (coinCount > 0) {
                System.out.println("Use " + coinCount + " of " + coins[index] + " cent coin(s)");
            }
            index--;
        }
    }

    public static void main(String[] args) {
        int[] coins = {1, 5, 10, 25, 50}; // 美国硬币面额
        int amount = 99; // 需要找的零钱
        findMinCoins(coins, amount);
    }
}

示例 2: 活动选择问题

给定多个活动,每个活动都有一个开始时间和结束时间,选择最大数量的互不重叠的活动。

import java.util.Arrays;
import java.util.Comparator;

public class ActivitySelection {

    static class Activity {
        int start, finish;

        Activity(int start, int finish) {
            this.start = start;
            this.finish = finish;
        }
    }

    public static void selectActivities(Activity[] activities) {
        Arrays.sort(activities, Comparator.comparingInt(a -> a.finish)); // 根据结束时间排序

        int count = 1;
        int lastFinishTime = activities[0].finish;
        System.out.println("Selected activity: (" + activities[0].start + ", " + activities[0].finish + ")");

        for (int i = 1; i < activities.length; i++) {
            if (activities[i].start >= lastFinishTime) {
                System.out.println("Selected activity: (" + activities[i].start + ", " + activities[i].finish + ")");
                lastFinishTime = activities[i].finish;
                count++;
            }
        }
        System.out.println("Total selected activities: " + count);
    }

    public static void main(String[] args) {
        Activity[] activities = {
            new Activity(1, 3),
            new Activity(2, 5),
            new Activity(4, 7),
            new Activity(6, 9),
            new Activity(5, 8),
            new Activity(8, 10)
        };
        selectActivities(activities);
    }
}

这些示例展示了贪心算法如何在不同的情境下被应用。贪心算法虽然简单,但不总是能得到全局最优解,它更多的是提供一种简单且有效的近似解。对于某些问题,如钱币找零问题的特定情况,贪心算法可以保证找到最优解。对于其他问题,则需要通过具体的分析来确定其有效性。

上次编辑于: