更新:この回答を投稿した後、既存の回答に同じアプローチがあることに気付きましたが、より冗長で、コードが機能しているため、私の回答はそのままにしておきます:)
元のアイテム プールに各アイテムのインスタンスが 1 つしかなく、アイテムが 2 進数を表している場合。
var items {
1 : 1,
2 : 1,
4 : 1,
8 : 1,
16: 1,
32: 1
};
問題は、これらの数字で表すことができるすべての数字のシーケンスを生成するように単純化されます。
- 0 ([ ] - 項目なし)
- 1 ([ 1 ])
- 2 ([ 2 ])
- 3 ([ 2, 1 ])
- 4 ([ 4 ])
- 等
したがって、あなたの問題は、バイナリではなく、混合基数の数値システムで表現できる数値のシーケンスを単に要求していると見なすことができます。
つまり、この奇妙な番号付けシステムのカウンターを記述して、値 0 と MAX を繰り返すことができます。したがって、最下位桁をインクリメントすることから始め、桁が取り得るすべての可能な値を使い果たしたら、上位桁に繰り越します。
var items = {
1: 12, // we have 12 x item1
2: 1, // we have 1 x item2
3: 1,
4: 7,
5: 2,
6: 2
};
var counter = {
1: 0,
2: 0,
3: 0,
4: 0,
5: 0,
6: 0
};
function increment(digit) {
if (digit > 6) {
return false;
}
var value = counter[digit] + 1;
if (value > items[digit]) {
counter[digit] = 0;
return increment(digit + 1);
}
counter[digit] = value;
return true;
}
while (increment(1)) {
var set = [];
for (var digit in counter) {
var value = counter[digit];
for (var i = 0; i < value; i++) {
set.push(digit);
}
}
document.write("<div>" + set + "</div>");
}
出力は次のようになります。
1
1,1
1,1,1
- - をちょきちょきと切る - -
2
1,2
1,1,2
---- 中略 ----
1,1,1,1,1,1,1,1,2,3,4,4,4,4,4,4,4,5,5,6,6
1,1,1,1,1,1,1,1,1,2,3,4,4,4,4,4,4,4,5,5,6,6
1,1,1,1,1,1,1,1,1,1,2,3,4,4,4,4,4,4,4,5,5,6,6
1,1,1,1,1,1,1,1,1,1,1,2,3,4,4,4,4,4,4,4,5,5,6,6
1,1,1,1,1,1,1,1,1,1,1,1,2,3,4,4,4,4,4,4,4,5,5,6,6