2016-05-02 11 views
0

数値のリストを計算して、希望の合計を加算するすべての組み合わせを表示する方法を見つけようとしています。それらが一度使用された後の入力番号は削除されたものとみなされます。数字のリストから指定された合計に達するまでの組み合わせの検索入力番号の繰り返しなしで

例:

入力:2、5、5、10、15、10
所望の合計:20
組み合わせ:[10 + 10] [5 + 15]

だから左すでに使用されている数字を繰り返すことができないので、数字がちょうど2と5であるので、[5 + 5 + 10]と言うことはできません。

この機能を探している間、私は百万円のソリューションを見つけることができますが、繰り返しを許すが、絶対に何もrepを防ぐことはできませんINPUTの数字を食べる(私はその組み合わせの反復を禁止するものがあるが、それは必要なものではなく、多くの繰り返し入力番号があるため必然的に組み合わせが繰り返される)

私の目的は、入力番号の繰り返しがなく、40のパックに大量の数値(潜在的に数百の値が5〜14)をグループ化する必要があることです。ここで

は、私が今

[5,9,5,5,6,7,8,7,5,6,8,8,7,5,7,5,7,5,5,8,8,8,9,5,8,6,5,8,8,8,5,6,9,6,9,8,7,5,9,5,6,8,5,5,5,7,7,6,8,7,8,6,9,6,6,6,8,5,6,6,6,5,8,6,6,6,8,9,10,10,10,10,14,14,13,13,8,6,7,7,12,12,12,11,11,12,12,12,5,10,5,6,6,11,6,6,9,10,6,13,6,5,8,7,8,5,6,6,8,6,5]

を使用して、複数回、それぞれの値を使用せずに、そのリストのショーに40のすべての可能な組み合わせを持っているしたい入力の例です。

ご協力いただきありがとうございます。

+0

リスト(5、5、5、10、10、15)を与えるか、[5,5,10] [5,15]または[10、 10] [5,15]セット。両方を生成しますか? – MBo

+0

いいえ、私は入力値のセットを各値を1回だけ使用したい、効率(最も可能性の高い組み合わせを見つける)は良いですが、必須ではありません。私は、使用された後に各入力番号を削除して合計40の合計を必要とするだけです。 – Xathian

答えて

0

単純な(非常に高速ではない)方法:

Repeat: 
Find the first set with needed sum 
Remove it's elements from the list 
    Repeat: 
    Check if similar set still exists // it's very likely for limited number range 
    Remove it's elements from the list