我的老师提出的作为家庭作业的算法有点问题。它是这样的:
有这样的棍子:
4(使用的桩数)
11 7 5 4(棍棒的长度)
1 1 3 3(每长度多少根)
我必须找出一种算法,通过合并它们来形成最小数量的棒。上一个示例的解决方案是:
15 3(15(最佳总和)* 3(最小棍棒)= 45 = 11 * 1 + 7 * 1 + 5 * 3 + 4 * 3)
11 4
7 4 4
5 5 5
现在我不是要求你们解决这个问题,但是为了给我一条线路,我试着将它减少为“改变”问题,它一直很好,直到我必须选择的部分从剩下的解决方案中获得好处。
所需的复杂性是指数级的,限制是:
那么你们还有第二个想法吗?
非常感谢你的时间。
关于最少数量的棍棒的说明:例如,如果我有一组棍棒。要形成的总和是80,我有相当多的解决方案:
1根长度为80的
2支长度40
4根长度为20的棍子。
第一个是微不足道的,我们丢弃它,因为剩下的解决方案我必须测试我是否可以使用我所拥有的一组棍子来构建它们,因为有可能选择的解决方案,例如2 * 40,这是一个可靠的,因为我们有没有使用的棍棒。
答案 0 :(得分:4)
这看起来很像Knapsack问题。
您还可以查看Branch and bound,这是针对各种优化问题的通用算法。
答案 1 :(得分:2)
事实上,有几乎与候选集一样多的方法......我想知道问题是否是NP完全的? ;-p
答案 2 :(得分:1)
注意:我在这个答案中称合并棒为“桩”。
当然,解决方案总是“1”。把你所有的棍子合并成一大堆;你有最佳总和 =所有木棍的总长度和最小桩 = 1。
现在,假设您想要1之后的下一个最小数字,那么有一些可行的选项。你会尝试2 最小的桩吗?为什么不? 4怎么样? 5?
假设你剩下两个候选人,3和5.(即最佳和 = 15,最小数量 = 3和最佳总和 = 9,最小桩 = 5)如果你知道你可以将你的枝条分成3堆长度为15的堆,你需要检查5堆(它们的长度是多少)?
所以,问题在于找出你是否可以将你的手杖安排到长度为 n 的 m 堆中。
我确信有很多关于这个问题的文献,但如果我是做家庭作业,我会先自己解决。
我首先尝试形成一个一堆 n 的一堆。然后尝试用剩余的棍子形成 m-1 长度为 n 的桩......
使用这种方法需要注意的是,您可能会在任何给定时间形成错误的堆,因此您需要一种回溯方式并尝试另一种组合。例如,假设我们有这些棍棒:20 1 7 7 7 7 14 6 15并试图形成4桩长度为21.这可以通过组合(20 1)(7 7 7)(7 14)(6) 15),但如果你从(14 6 1)开始,没有解决方案可以为你剩下的棍子提供3x21的桩。现在,我不确定这是否表明4x21不是答案。 (事实上,答案是2x42。)如果是这种情况,如果你总是以较小的数字开始,你就不会遇到这个“错误”堆的问题,即在尝试4x21之前尝试了2x42。但是,不确定,我会编写代码,在放弃之前会回溯并尝试所有不同的组合。
答案 3 :(得分:0)
我不确定我是否理解这个问题。
我假设每个桩的长度必须相同?也就是说,所有桩的长度之和必须相同?
我们这里有三堆。这三个来自哪里?如果可以制造2桩,你会选择哪一个?例如,如果你只有六根X长度的棍子,你会分别用两根棍子或两根桩子做三堆,每根都有三根?
我猜蛮力方法是:你试图制造X桩。将所有排列/组合放入每个堆中,看看每个堆中是否有相同的总长度。
如果你给每根棍子提供独特的名字会有帮助吗?在这种情况下,你有11-1,7-1,5-1,5-2,5-3等