【问题标题】:Java: Get the most efficient combination of a large List of objects based on a fieldJava:基于字段获取大型对象列表的最有效组合
【发布时间】:2023-11-29 23:29:01
【问题描述】:

在给定一定的budget 和组合的最大限制的情况下,我希望最大化stars 的数量...

示例问题:

预算为 500 欧元,仅访问最多允许或更少的餐厅,用餐并收集尽可能多的星星。

我正在寻找一种高效的算法,它可能会处理 100 万个 Restaurant 实例,最多可处理 10 个 maxRestaurants...

谁能帮忙解决这个问题?

注意:这不是家庭作业。我故意将尝试留空,因为我不想影响解决方案的效率

Restaurant.java

public class Restaurant {
  double cost;
  int stars;

  public Restaurant(double cost, int stars) {
    this.cost = cost;
    this.stars = stars;
  }
}

Main.java

import java.util.List;
import java.util.Arrays;

class Main {

  public static void main(String[] args) {
    Restaurant r1 = new Restaurant(100.0, 5);
    Restaurant r2 = new Restaurant(20.0, 1);
    Restaurant r3 = new Restaurant(75.0, 3);
    Restaurant r4 = new Restaurant(125.0, 4);
    Restaurant r5 = new Restaurant(60.0, 2);
    Restaurant r6 = new Restaurant(80.0, 4);
    Restaurant r7 = new Restaurant(40.0, 1);
    Restaurant r8 = new Restaurant(200.0, 3);
    Restaurant r9 = new Restaurant(120.0, 3);
    Restaurant r10 = new Restaurant(50.0, 2);

    List<Restaurant> restaurants = 
        Arrays.asList(r1, r2, r3, r4, r5, r6, r7, r8, r9, r10);

    double budget;
    int maxRestaurants;

    budget = 500.0;
    maxRestaurants = 1;
    // { r1 } -- 5 stars

    budget = 200;
    maxRestaurants = 2;
    // { r1, r6 } -- 9 stars

    budget = 500;
    maxRestaurants = 5;
    // { r1, r4, r6, r3, r9 } -- 19 stars

    budget = 200;
    maxRestaurants = 10;
    // { r1, r6, r2 } -- 10 stars

  }
}

【问题讨论】:

  • 如果在预算范围内,您可以按stars/cost 的顺序对列表进行排序,并在您的结果中使用它们
  • 这实际上是我起草潜在评论输出的方式......有趣的是,我从未真正想过以这种方式实施解决方案。谢谢!
  • 嘿@bohemian,我已经尝试过(使用Python,因为它更容易)并在这里重新发布了这个问题:*.com/questions/59094139/…如果你看这里,解决方案有问题:@ 987654322@ - 不知道你能不能看一下?问题是,基于星数/成本,顺序意味着一旦添加了一些值,较大的值可能会超过预算限制,即使它们本来是最佳解决方案(在示例中 100 是 5 星)跨度>
  • 首先,我的建议可能找不到最佳解决方案,但它要简单得多,并且可能会找到一个可以接受的好解决方案。现在您可以通过首先比较星数/成本来优化排序顺序,如果该值相等,则首先按最大星数排序。

标签: java algorithm search time-complexity combinations


【解决方案1】:

这是multidimensional 0-1 knapsack problem 的一个实例。

为此建模,将餐厅的权重向量定义为(price, 1),其中price 是在该餐厅用餐的价格。限额为(budget, maxRestaurants),收益为stars 与所选餐厅的总和。

背包问题,以及它的大多数变体,包括 0-1 背包和多维背包,都是 NP-hard。这意味着没有任何已知算法能够提供准确的答案,同时也能很好地扩展到大输入大小(例如 1000 万)。

【讨论】:

  • 谢谢你!这肯定有助于寻找解决方案。