私の問題は、整数の配列の合計が値になる組み合わせの数を数える必要があることですW
。
言ってみましょう:
int array[] = {1,2,3,4,5};
私のアルゴリズムは、から1
までの長さのすべての組み合わせを見つけるだけです.W / minimum(array)
W
N
これを解決する他のアルゴリズムはありますか? より速くなるはずです:)
更新: OK、サブセット問題とナップザック問題は良いですが、私の問題は、配列の組み合わせが次のように要素を繰り返すことです:
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
、生成された組み合わせの順序は重要ではないため、および と1,2,1
同じです。1,1,2
2,1,1