【问题标题】:Maximize the result for given array of values最大化给定值数组的结果
【发布时间】:2022-11-29 02:09:29
【问题描述】:

我有一个值数组示例:

[[1,15], [3,20], [4,30]]每个元素都有两个值,amount我们需要在第0个索引处支付,items我们可以在第一个索引处收取。另外,我的 budget 为 4。

对于这个例子,我可以收集元素[[1,15], [3,20]],因为1+3 = 4符合我的预算,我可以收集的项目是15+20 = 35 which is the maximum

我想找出我可以使用此预算收集的最大项目数。

这是我的程序:

public static long solve(List<List<Long>> arr, long budget) {
    arr.sort((a, b) -> {
        int z = Long.compare(a.get(0) , b.get(0));
        if(z == 0) {
            z = Long.compare(b.get(1) , a.get(1));
        }
        return z;
    });
    
    long total = 0;
    long result = 0;
    for(List<Long> list : arr) {
        if(total + list.get(0) <= budget) {
            total += list.get(0);
            result += list.get(1);
        } else {
            break;
        }
    }
}

该程序适用于上述问题。

这是程序给出错误结果的另一个例子。

[[50, 200], [100, 800],[200, 1000], [500, 2000], [1000, 3000]],每个元素有两个值,我们需要在第 0 个索引处支付的金额和我们在第 1 个索引处可以收集的项目。另外,我的预算是1700

结果应该是项目 [200, 1000], [500, 2000], [1000, 3000] ,所以 1000+2000+3000 = 6000 但我的程序返回 4000 因为我的错误方法。

这个问题的正确方法是什么?

【问题讨论】:

    标签: java algorithm


    【解决方案1】:

    这只是0/1 knapsack problem 的变体。

    每件物品的成本就是“重量”,你的预算就是“总重量”,你可以收集的物品数量就是那个物品的“价值”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 2016-05-27
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多