动态规划 http://en.wikipedia.org/wiki/Dynamic_programming是您正在寻找的解决方案。
[4, 3, 10, 3, 2, 5] 的示例:
X-Axis: Reachable sum of group. max = sum(all numbers) / 2 (rounded up)
Y-Axis: Count elements in group. max = count numbers / 2 (rounded up)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
1 | | | | 4| | | | | | | | | | | // 4
2 | | | | | | | | | | | | | | |
3 | | | | | | | | | | | | | | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14
1 | | | 3| 4| | | | | | | | | | | // 3
2 | | | | | | | 3| | | | | | | |
3 | | | | | | | | | | | | | | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14
1 | | | 3| 4| | | | | |10| | | | | // 10
2 | | | | | | | 3| | | | | |10|10|
3 | | | | | | | | | | | | | | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14
1 | | | 3| 4| | | | | |10| | | | | // 3
2 | | | | | | 3| 3| | | | | |10|10|
3 | | | | | | | | | | 3| | | | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14
1 | | 2| 3| 4| | | | | |10| | | | | // 2
2 | | | | | 2| 3| 3| | | | | 2|10|10|
3 | | | | | | | | 2| 2| 3| | | | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14
1 | | 2| 3| 4| 5| | | | |10| | | | | // 5
2 | | | | | 2| 3| 3| 5| 5| | | 2|10|10|
3 | | | | | | | | 2| 2| 3| 5| 5| | |
^
12是你的幸运数字!回溯得到该组:
12 - 5 = 7 {5}
7 - 3 = 4 {5, 3}
4 - 4 = 0 {5, 3, 4}
然后可以计算另一组:{4,3,10,3,2,5} - {5,3,4} = {10,3,2}
所有带有数字的字段都是一个包的可能解决方案。选择右下角最远的一个。
顺便说一句:这就是所谓的背包问题 http://en.wikipedia.org/wiki/Knapsack_problem.
如果所有权重(w1,...,wn 和 W)都是
非负整数,背包
问题可以解决
使用动态伪多项式时间
编程。