各要素が一度だけ使用されるリストから、サブセットのすべての組み合わせを見つけようとしています。
私の言いたいことを明確にするために、次の例のリストを示します。
[1、2、3、4]
次の組み合わせを生成できます。
[(1), (2), (3), (1, 2), (1, 3), (2, 3), (1, 2, 3)] (これは網羅的なはずです!)
次に、これらの組み合わせの組み合わせを生成できます。
[[(1), (2), (3)], [(1, 2), (3)], [(1, 3), (2)], [(1), (2, 3)] ,[(1, 2, 3)],... (多くの場合)]
要点は、特定の組み合わせで各要素を 1 回だけ使用できることです。だから私は持つことができません:
[(1), (1, 2, 3)] 要素 1 が 2 回使用されているためです。
私は小さな n (n < 10) に対してブルート フォースを試みてきましたが、Python を使用して失敗しています。この時点では、実行時の問題 (小さな n!) でさえありませんが、すべての可能性を見つけているわけではありません!
質問の仕方がよくわからないので、明確な質問をしてください。また、質問を明確にするのに役立つ特定のキーワードがある場合は、教えてください。私は Python のアプローチに興味がありますが、これを行うのに役立つあらゆる数学のアプローチを受け入れます。ランタイムは後で取り組みたい問題です。
ありがとう!
編集1:この質問を表示する別の方法は、サブセット合計の問題ですが、注意1:すべての可能なサブセットを見つけるだけでなく、元のリストの要素の最大数が使用されるように、サブセットの組み合わせのすべてのセットを見つけます。ここで、個々のサブセットの合計は 0 (または k) になります。
私の目標は、すべての回答をループし、最終的に使用されなかった要素の数に基づいてスコアを付け、サブセットの「最適な」セットを選択することです.
編集 2: 回答は受け入れられましたが、ユーザーが作成したリスト myList = ['a', 'b', 'c', 'd'] を受け入れるように変更されました
def partitions(myList):
if not myList:
yield []
else:
for partial_partition in partitions(myList[:-1]):
for i in range(len(partial_partition)):
copy_partition = partial_partition[:]
copy_partition[i] += (myList[-1],)
yield copy_partition
yield partial_partition + [(myList[-1],)]