java - 最大化给定值数组的结果

标签 java algorithm

我有一个值数组示例:

[[x,y], [x1,y1]] 每个元素包含两个值,我们需要在第 0 个索引处支付的 amountitems 我们可以在第一个索引处收集。另外,我的预算为 z。

我想找到使用此预算可以收集的最大元素数量。

这是我的程序:

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

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

最佳答案

这只是 0/1 knapsack problem 的一个变体.

  • 每件元素的成本就是“重量”
  • 预算成为“总重量”
  • 您可以收集的元素数量将成为该元素的“值(value)”

编辑

如果总权重很大,无法使用传统的动态规划方法,可以重新定义状态来得到解决方案,如here所示.

关于java - 最大化给定值数组的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74604742/

相关文章:

java - 图像和堆大小问题

java - 面对此代码的输出问题

ios - Swift UITextField deleteBackward 问题

PHP URL 缩短算法

xml - 如何从 GPX 文件计算距离?

algorithm - 找到 m 个最大的数字

java - JTabbedPane ChangeListener

java - 使用 netbeans 和场景生成器运行程序之间的显示问题

java - 如何使用 CSS 集中 DataTables 分页栏?

java - 如何减少这个程序的执行时间