【发布时间】:2017-09-15 01:06:52
【问题描述】:
问题陈述:
有 N 块积木 (a1, a2, ...., aN)。每块砖的长度为 L1, L2, ...., LN)。使用提供的砖块制作 2 个最高的平行柱子(相同长度的柱子)。
约束:
- 有 N 块砖。 5
- 每块砖的长度。 1
- 砖块长度的总和
砖块的长度没有按尺寸顺序给出。可能有多个具有相同长度的砖块。并非所有的砖都必须用来制作柱子。
例子:
第一个例子-
N = 5
2、3、4、1、6
可能的组合:
(2, 6) 和 (3, 4, 1)
答案:8
我的方法:
找到 2 个平行柱子的最大可能长度,即。地板(N / 2)。然后,使用 DP 找到所有可能使用所有积木的总和长度。从可能的最高总和
上述方法的问题在于它只检查元素的一个子集以形成所需的总和。应该检查可以形成所需总和的所有可能子集,然后对于这些子集中的每一个,使用剩余的元素检查是否可以形成相同的所需总和。问题是在我目前的方法中实现这一点。
第二个例子-
N = 6
3、2、6、4、7、1
可能的组合:
(3, 2, 6) 和 (7, 4)
答案:11
我的代码中的问题可能出现在这种情况下,具体取决于元素(砖块长度)作为输入的顺序。第一个集合可能是使用元素 (3, 7, 1) = 11 形成的,但第二个集合 (2, 6, 4) 不能形成 sum = 11。因此,我的代码开始寻找下一个可能的最大值总和。 10 错了。
有人可以建议我目前的方法更好的方法或可能的改进吗?
【问题讨论】:
标签: algorithm graph tree dynamic-programming backtracking