Algorithm 箱子堆垛问题,根据其重量之和对其进行排序+;力量

Algorithm 箱子堆垛问题,根据其重量之和对其进行排序+;力量,algorithm,greedy,Algorithm,Greedy,我有一个问题,通过证明以下贪婪算法总是给出一个正确的解决方案,如果有一个 给定n个箱子,每个箱子都有固定的重量和强度(w,s)。箱子的强度决定了它可以承受的载荷。我们必须形成一堆箱子,并将它们一个接一个地排列,以便所有箱子都在一堆中。假设有一个问题的解决方案,我必须证明我总是可以通过将箱子按重量和强度之和的降序放在堆栈中来声明它。这意味着给定n个框,我们将始终具有以下内容:w1+s1>w2+s2>wn+sn,其中,框1(w1,s1)位于堆栈的底部,依此类推 我知道最好的情况是最重的箱子在底部,强

我有一个问题,通过证明以下贪婪算法总是给出一个正确的解决方案,如果有一个

给定n个箱子,每个箱子都有固定的重量和强度(w,s)。箱子的强度决定了它可以承受的载荷。我们必须形成一堆箱子,并将它们一个接一个地排列,以便所有箱子都在一堆中。假设有一个问题的解决方案,我必须证明我总是可以通过将箱子按重量和强度之和的降序放在堆栈中来声明它。这意味着给定n个框,我们将始终具有以下内容:w1+s1>w2+s2>wn+sn,其中,框1(w1,s1)位于堆栈的底部,依此类推

我知道最好的情况是最重的箱子在底部,强度最大的箱子也在底部。通过运行几个实例,我们总能从中得到一个解决方案,我发现这个贪婪算法也给出了一个解决方案

有什么想法吗?
提前感谢您的帮助。

要解释订购技巧,请参见:

我们想证明,我们可以按照
weight+strength
升序重新排列任何合法的盒子堆栈。要做到这一点,我们需要表明,任何连续对

(1) strength(b_i+1) + weight(b_i+1) < strength(b_i) + weight(b_i)
重量(b_i+1)
添加到两侧:

(4) (Sum j=1...i−1 of weight(b_j)) + weight(b_i) + weight(b_i+1) ≤ strength(b_i+1) + weight(b_i+1)
用(1)代替右侧:

(Sum j=1...i−1 of weight(b_j)) + weight(b_i) + weight(b_i+1) ≤ strength(b_i) + weight(b_i)
取消重量(b_i):

“显而易见”的攻击是典型的间接证明:假设存在一个解决方案,首先假设贪婪方法不是一个解决方案。从那里开始工作,形成矛盾

所以。。。我们给出了一系列
N
框;我们将按照贪婪的顺序对它们进行编号,就像在您的问题陈述中一样


一个合法的堆叠是这样的,对于所有的
2,你能不能解释一下你是如何通过矛盾来实现这一点的,因为这对我来说并不明显。。。提前谢谢。另一个答案已经涵盖了足够的数学知识。我攻击它是作为间接证据。
(4) (Sum j=1...i−1 of weight(b_j)) + weight(b_i) + weight(b_i+1) ≤ strength(b_i+1) + weight(b_i+1)
(Sum j=1...i−1 of weight(b_j)) + weight(b_i) + weight(b_i+1) ≤ strength(b_i) + weight(b_i)
(Sum j=1...i−1 of weight(b_j)) + weight(b_i+1) ≤ strength(b_i)