我的问题是,我需要计算有多少整数数组的组合总和为一个值W
。`
让我们说:
int array[] = {1,2,3,4,5};
我的算法只是找到从1
到的所有长度组合W / minimum(array)
,这等于,W
因为最小值为 1。如果每个组合的总和等于 W,则检查每个组合,然后增加一个计数器N
。
任何其他算法来解决这个问题?应该更快:)
更新: 好的,子集问题和背包问题都很好,但我的问题是数组的组合重复了元素,像这样:
1,1,1 -> the 1st combination
1,1,2
1,1,3
1,1,4
1,1,5
1,2,2 -> this combination is 1,2,2, not 1,2,1 because we already have 1,1,2.
1,2,3
1,2,4
1,2,5
1,3,3 -> this combination is 1,3,3, not 1,3,1 because we already have 1,1,3.
1,3,4
.
.
1,5,5
2,2,2 -> this combination is 2,2,2, not 2,1,1 because we already have 1,1,2.
2,2,3
2,2,4
2,2,5
2,3,3 -> this combination is 2,3,3, not 2,3,1 because we already have 1,2,3.
.
.
5,5,5 -> Last combination
这些都是{1,2,3,4,5}
长度为 3 的组合。子集和问题给出了另一种我不感兴趣的组合。
所以总和的组合W
,可以说W = 7
,
2,5
1,1,5
1,3,3
2,2,3
1,1,2,3
1,2,2,2
1,1,1,1,3
1,1,1,2,2
1,1,1,1,1,2
1,1,1,1,1,1,1
更新:
真正的问题是元素的重复1,1,1
是需要的,并且生成的组合的顺序并不重要,因此与and1,2,1
相同。1,1,2
2,1,1