- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
public static int KnapSack(int capacity, Item[] items, int numItems) {
if (numItems == 0 || capacity == 0)
return 0;
if (items[numItems-1].weight > capacity)
return KnapSack(capacity, items, numItems-1);
else {
int took = items[numItems-1].value + KnapSack(capacity - items[numItems-1].weight, items, numItems-1);
int left = KnapSack(capacity, items, numItems-1);
return Math.max(took, left);
}
}
所以我有一个有效的 0/1 递归蛮力算法来解决 KnapSack 问题。我想知道打印出工作解决方案的方法是什么(即从项目集中收集到背包中的项目)。我已经尝试了很多事情,例如添加到列表中并尝试跟踪我添加的内容,但都没有解决实现或设计问题。所以我来这里寻求帮助,谢谢!
最佳答案
要跟踪拿走的元素,请尝试以下方法:
public static int KnapSack(int capacity, Item[] items, int numItems, ArrayList<Integer> taken) {
if (numItems == 0 || capacity == 0)
return 0;
if (items[numItems-1].weight > capacity)
return KnapSack(capacity, items, numItems-1, taken);
else {
final int preTookSize = taken.size();
final int took = items[numItems-1].value + KnapSack(capacity - items[numItems-1].weight, items, numItems-1, taken);
final int preLeftSize = taken.size();
final int left = KnapSack(capacity, items, numItems-1, taken);
if (took > left) {
if (taken.size() > preLeftSize)
taken.removeRange(preLeftSize, taken.size());
taken.add(Integer.valueOf(numItems - 1));
return took;
}
else {
if (preLeftSize > preTookSize)
taken.removeRange(preTookSize, preLeftSize);
return left;
}
}
}
这可能不是最有效的,但我认为它应该有效。
(为了提高效率,您可以尝试将获取的 ArrayList 预先分配为“足够大”,以便在递归循环期间不需要进行任何分配。)
关于java - 在 0/1 KnapSack 中打印结果(递归蛮力),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20342386/
我正在尝试解决背包问题,这也是一个整数规划问题。我研究了几种近似解决方案,例如动态规划、贪心算法、分支定界算法、遗传算法。你能告诉我一个可以帮助实现任何/所有这些算法的库(任何语言)吗? 提前致谢。
我正在尝试解决背包问题,这也是一个整数规划问题。我看过几种近似解,如动态规划、贪心算法、分支定界算法、遗传算法。你能告诉我一个有助于实现任何/所有这些算法的库(任何语言)吗? 提前致谢。 最佳答案 以
这是一个有趣的小项目,我已经开始尝试并最大限度地提高赢得办公室曲棍球池的机会。我试图找到最好的方法来选择 20 名能够在最高工资帽内给我最多分数的球员。 例如,假设原始数据由 玩家姓名 位置(前锋,后
我有一个总数为540000的数字列表。我想将此列表分为3个列表,每个列表总共180000。最有效的编程方法是这样做,假设数字列表是一个平面文件,每个数字为线? 最佳答案 听起来像Knapsack pr
最近,我正在尝试研究和实现背包问题(我几年前研究过)。所以我可以理解并有最优解的想法,比如如果背包值(value)是 100,并且有特定的权重,比如 40、60、100。那么最优解将是 100 来填充
这是我的代码: def knapsack_dynamic(ws, vs, W): n = len(ws) K = [[0] * (W+1)] * (n+1) for i in
我在显示使用过的数字时遇到问题。我正在使用 KnapSack 算法,我想显示我用来获得最高值的所有数字。所以有我的代码: static int max(int a, int b) { int
我正在尝试编写具有给定条件的背包 c# 算法,但我总是遇到两个问题。我收到“索引超出数组范围”错误或我的结果仅为 0。 我找到了几个 Knapsack 实现的代码示例,但无法弄清楚我做错了什么。 代码
我在解决 codechef 上的程序时遇到了一个问题,它是背包问题的修改版本..1.在这里我必须找到所有可能重量的最大成本..1 using namespace std; #define
我已经在线阅读了 01 背包问题的几个解决方案。当总权重为 W 时,他们每个人都试图存储从 0..i 和总权重 w 中选择的子问题权重的解决方案。所以基本上他们需要一个 2D 数组来存储子问题的解决方
我已经编写了 Java 代码来解决 Spoj.com 上的以下问题,但它给了我“超出时间限制”。我不知道为什么会这样,我已经做了太多优化。 The famous knapsack problem. Y
我正在尝试做背包问题,这是我想出的递归解决方案。这可以做得更好吗?我想我需要通过检查我之前是否达到过这种状态来添加内存。我是否需要为 state[c_w][i] 添加状态? 我有意没有使用动态规划,因
我正在学习第一门编程类(class),但现在我陷入了困境。基本上,我们所做的是从文本文件中获取 16 个值(在第一行代码上),并且在第二行代码上有一个值。我们将这 16 个值读入一个数组,并将第二行值
所以我正在努力使用分支定界算法来实现 KnapSack 问题。我已经完成了它的实现,但我遇到了一些奇怪的编译错误,我不知道如何修复: 编译错误 gcc -Wall -pedantic -g -std=
我正在尝试理解 Knapsack 1/0 Problem 的这种动态编程方法但我没能得到算法。 有人能解释一下这个具体的实现吗,摘自Rosetta Code大部头书? 用一些注释更新代码会有很大帮助!
我在给定的任务上苦苦挣扎了将近一个星期,但没有成功找到解决方案,所以这个网站是我最后的希望。 我有0-1 Knapsack问题有 20 个具有不同值和权重的项目,麻袋的最大重量为 524。现在我需要实
这个问题在这里已经有了答案: How to find which elements are in the bag, using Knapsack Algorithm [and not only th
在做一个项目时我遇到了这个问题,我将在这个问题的实际领域之外重新措辞(我想我可以谈论烟花的口径和形状,但这会使理解更加复杂).我正在寻找一种(可能是近似的)算法来解决它。 我有 n 个不同大小的容器,
我在 R 中创建了这个简单的代码来解决具有递归函数的背包程序 n k) { output myfunction k) { + output myfunctio
我正在使用一维数组来获得最终答案,但我还需要获得选定的项目。如何实现? private static int UnboundedKnapsack(int capacity, int n, in
我是一名优秀的程序员,十分优秀!