背包问题
发布日期:2021-05-16 15:24:35 浏览次数:20 分类:精选文章

本文共 1949 字,大约阅读时间需要 6 分钟。

Java实现背包问题的贪心算法

在这个实现中,我们将背包问题通过贪心算法来解决。贪心算法是一种在每一步选择最优或局部最优选择来达到全局最优的策略。在背包问题中,贪心算法通常基于物品的重量或价值进行排序,以便在有限的时间内找到最优解。

贪心算法的基本思想

贪心算法的核心思想是通过每一步的选择来逐步逼近最优解。在背包问题中,常见的贪心策略包括:

  • 按照物品的价值从高到低排序
  • 按照物品的重量从低到高排序
  • 根据剩余的背包容量来选择最优物品
  • 在这个实现中,我们选择了按物品的价值从高到低排序的策略。这样可以在背包容量允许的情况下,尽可能多地携带高价值的物品。

    Java实现步骤

  • 读取输入数据

    • 首先,我们从标准输入读取背包的容量 m 和物品数量 n
    • 然后,我们读取每个物品的价值 v 和重量 w
  • 创建物品对象

    • 将每个物品存储在一个 Item 对象中,并将这些对象存储在一个数组中。
    • 使用 Arrays.sort() 方法对物品数组进行排序。排序的比较器是根据物品的价值从高到低排序。
  • 贪心选择物品

    • 初始化结果变量 result 为 0。
    • 遍历排序后的物品数组:
      • 如果当前物品的重量大于背包容量 m,则选择这个物品并加到结果中,然后跳出循环。
      • 否则,将物品的价值乘以重量加到结果中,并将背包容量减少相应的重量。
  • 输出结果

    • 打印最终的结果,即背包的最大价值。
  • 代码实现

    package 贪心;
    import java.util.Arrays;
    import java.util.Comparator;
    import java.util.Scanner;
    public class 背包问题 {
    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int m = sc.nextInt();
    int n = sc.nextInt();
    Item[] items = new Item[n];
    for (int i = 0; i < n; i++) {
    int v = sc.nextInt();
    int w = sc.nextInt();
    items[i] = new Item(v, w);
    }
    Arrays.sort(items, new Comparator
    () {
    @Override
    public int compare(Item o1, Item o2) {
    return o2.v - o1.v;
    }
    });
    int result = 0;
    for (int i = 0; i < items.length; i++) {
    if (items[i].w > m) {
    result += items[i].v * items[i].w;
    m -= items[i].w;
    break;
    } else {
    result += items[i].v * items[i].w;
    m -= items[i].w;
    }
    }
    System.out.println(result);
    }
    }
    static class Item {
    public int v;
    public int w;
    public Item(int v, int w) {
    this.v = v;
    this.w = w;
    }
    }

    代码解释

    • Item 类:用于存储每个物品的价值和重量。
    • 主函数 main:读取输入数据,创建物品对象,并对物品进行排序。
    • 排序逻辑:根据物品的价值从高到低排序。
    • 贪心选择逻辑:遍历排序后的物品,根据背包容量选择物品。
    • 结果输出:打印背包的最大价值。

    这种贪心算法的时间复杂度主要由排序操作决定,为 O(n log n),适用于小规模的背包问题。对于大规模的问题,可能需要采用动态规划或其他更高效的算法。

    上一篇:独木舟上的旅行2
    下一篇:拓扑-士兵排队问题3

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2025年04月17日 23时09分42秒