我完成了一项规格要求的作业:
我花了好几个小时阅读垃圾箱包装和背包问题。
以下工作但效率很低。我得到一个堆栈溢出十几个左右的值。非常低效,无法扩展,我不知道从哪里开始。
建议将不胜感激。是的,这是一项学术任务,但我宁愿清除问题而不是放弃并赚取B。
public void calculateCombinations(int capacity, int index) {
count++;
if(index < values.length) {
if(values[index] <= capacity) {
currentSolution.addLast(index);
if(values[index] == capacity)
flushSolution();
else
capacity -= values[index];
}
calculateCombinations(capacity, index + 1);
} else
if(currentSolution.peekLast() != null)
calculateCombinations(capacity + values[currentSolution.peekLast()], currentSolution.removeLast() + 1);
}
答案 0 :(得分:3)
装箱问题的关键启发式方法是始终先装入最笨拙(最大)的物品。例如,如果你正在装一辆移动的卡车,你先放钢琴,然后再担心较小的东西。我们的想法是最大化您的灵活性。
另一种技术是我称之为“包围”。假设您正在寻找两个总和为50的数字,并且您有一个类似{2,3,9,18,24,29,37,45}的列表。您不必检查每个组合,因为您不能有超过25或25的两个值。您只需要检查列表每侧的数字,即45 + 2,45 + 3,45 + 9,STOP,下一个号码,37 + 2,37 + 3等。这是包围。通过创建一组规则并围绕均值进行包围,您只需要检查一小部分可能的组合。
Bin打包是一个搜索问题,因为在很多情况下,因为您无法枚举所有可能的组合。这就像国际象棋;你无法计算每一个可能的举动,你只是想找到一个好的举动。