【发布时间】:2012-11-28 20:37:55
【问题描述】:
我正在写一个程序:
例如输入是 5(它不仅可以是 5)数字,我在数组中读取数据:1, 2, 3, 4, 5。我可以从这个数组中选择一些元素(不是第一个或最后一个),例如3,然后我删除数组中的这个数字,并将 sum (最初是 0 )相乘的从左到右的元素与从右到右的元素相乘(在这种情况下是指 2*4 )。结果数组是1, 2, 4, 5,然后我一次又一次地这样做,直到元素数等于2(正好是1 and 5,因为我们不能删除这些数字)。
例如:(其中 A、B、C、D 是一对数字 1 和 2、2 和 3 等。)
A B C D
1 2 3 4 5
删除元素的顺序有 6 种可能的组合(并在 sum 中添加左右乘法):
A (B (C D))
A ((B C) D)
(A B) (C D)
(A (B C)) D
((A B) C) D
A (B (C D))
目标是找到最小的总和!有两种解决方法,一些聪明的算法或对每个组合使用递归,然后选择最小的一个。谁能给我一个提示如何编写这样的递归,从哪里开始编写(或者可能是一些聪明的算法)。天呐
【问题讨论】:
-
我不明白为什么会有五种组合。您可以删除除结束元素之外的所有元素,并且可以按任何顺序进行删除。对于一个包含 5 个元素的列表,这将使 (5-2)! = 6 种组合。 (它们是:(2, 3, 4), (2, 4, 3), (3, 2, 4), (3, 4, 2), (4, 2, 3), (4, 3, 2 ).) 在您的示例中,您永远不会将 1 和 2 配对,因为它们之间没有任何东西可以删除!
-
能否请您在您的示例中添加操作
A (B (C D)) -
按升序对列表进行排序,并继续删除左起第 2 个位置的元素 - 在您的示例中按该顺序删除 2、3、4。总和不会低于这个。
-
可能只是我 - 但我已经阅读了 3 次问题,但无法理解您到底想要什么。最小子集的总和不是空的吗?你能正式定义你到底在追求什么吗? :|
-
@amit - 我相信 OP 希望以最小化结果总和的顺序删除所有内部元素。 (当然,这样的命令可能不止一个。)