我们有一个包含2n袜子的'S'组。该组中的每个袜子都有一种颜色。 颜色由实数正数表示。 [c:S - > R(+)] 该组中的2只袜子可能颜色相同。
- 我们定义了一双袜子(a,b)的“惩罚”: P(a,b)= | c(a)-c(b)|。 (换句话说,2种相同颜色袜子的“惩罚”是0)
我需要描述一个贪婪的算法,该算法将组S作为输入并返回包含袜子对的组A(来自S的每个袜子,恰好是A的一次)并且总结惩罚将最小化即可。 [总结惩罚=>小组中所有对的惩罚总和]
我需要证明算法是正确的。 我有证明我的算法是正确的问题, 我根据它们的数字颜色值对袜子进行了分类,并且每次从S中挑选出第一个。 我尝试用感应来证明它,但我不知道如何在最佳组中进行“切换”部分。
答案 0 :(得分:0)
所以你的算法是正确的:)
证明: 想象一下,我们对我们的问题有不同的解决方案,这比我们的问题更好(我们只是排序和匹配最接近的一起)。因此必须至少存在两对(a
1) a在区间(c,d)中,b与它们不同或相似。
(否则我们会在我们的解决方案中使用这对)。
现在让我们来计算惩罚:惩罚是| a-b | + | c-d |
因为我们的 1)我们可以考虑我们数字的顺序,例如:
2 :a< c< b< d
3 :a< c< d< B'/ P>
4 :c< a< b< d
5 :c< a< d< B'/ P>
每个计算器的计算结果几乎相同: 我们可以很容易地证明
例如在( 2 )中表示| a-b | + | c-d | > | A-C | + | b-d |,
因为a-b&lt; a-c和a&lt; c&lt; b所以| a-b | &GT; | A-C | c-d&lt; b-d和c < b&lt; d所以| c-d | &GT; | B-d |
现在如果发生这种情况,交换这些值会将此解决方案更改为更好的解决方案,如我们的算法中所示:)