C ++の配列で、可能なすべての組み合わせをリストする方法は?
質問
私は宿題の割り当てを持っています、そして、この種の問題のためにコードから始める方法がわかりません。
n要素で構成される整数配列があるとしましょう。
a] [b] [c] [d] [e](たとえば、5つの要素があります)
すべての組み合わせの合計(ABCDE、ABCD、ABCE、ACDE、BCDE、ABC、ABD、ABE、ACE、ADE、BDE、CDE、AB、AC、AC、AC)の合計を印刷したい可能性のすべてをリストしたいと思います。 、AD、AE、BC、BD、BE、CD、CE、DE、A、B、C、D、およびE)
別の例は、配列内の4つの要素です([a] [b] [c] [d])
(ABCD、ABC、ABD、ACD、BCD、AB、AC、AD、BC、BD、CD、A、B、C、D)の組み合わせのすべての合計をリストしたいと思います。
皆さんが私の質問を理解できることを願っています。私はそれのために助けが必要です、そして私はそれをどうするかわかりませんか?
解決
さて、ここに従うべき簡単なルールがあります:
「ABCDE」のすべての組み合わせのセットは、「a」を含む(したがって始まる)組み合わせと「a」を含むもので構成されています。どちらの場合も、「BCDE」のすべての組み合わせが発生する可能性があります。もちろん、「BCDE」の組み合わせも同じ方法で扱うことができます。
他のヒント
あなたが「可能性のすべての合計をリストする」と言うとき、あなたはあなたが知りたいということですか 幾つか 実際に組み合わせは可能ですか?
もしそうなら、一度に撮影されたnアイテムの組み合わせを検索します。このサイトには、この問題に対処するページがあります。次に、(5) +(4) +(4) +(3) +(2) +(1)の組み合わせの数を追加して、合計「可能性の合計」を取得するだけです。
それとも、値の配列があり、要素の異なる組み合わせで表されるさまざまな金額を文字通り印刷したいということですか?その場合、すべての組み合わせを実際に列挙し、合計を評価する必要があります。
したがって、{1、2、3、4、5}の配列が与えられると、これを「A」、「B」、「C」、「D」、「E」とエンコードできます。タプルの例は次のとおりです。
- ABCDE = 1+2+3+4+5
- ABE = 1+2+5
- BCE = 2+3+5
など、エンコードされた列挙を使用して、合計のaddendsを選択します。重複を許可するか、禁止するか(つまり、「ed」とは異なる「de」は「de」)を決定すると、結果に非常に大きな影響があることに注意してください。ほとんどの場合、これはおそらくそうなるでしょう いいえ あなたが望むものになりなさい。
3つの要素がある場合、各要素が1〜3(または0〜2)の特定の位置に配置され、特定のセットに要素が含まれているかどうかを表すブールアレイを想像する場合があります。
ABC remark
--- ---------------------
000 no element in the set
001 one element, C
010 one element, b
100 ...
011 two elements, b and c
...
111 all elements contained
この場合、この場合は2³であるソリューションの数を計算し、バイナリ表現から011から(b、c)までのセットへのマッピングを行う関数を生成すると、Aを簡単にプログラムできます。ループは0からmax-1に反復し、マッピング関数によって生成されるすべてのセットを返します。