更新:發佈這個答案後,我注意到一個existing answer有同樣的做法,但我還是會繼續我的周圍,因爲它是更冗長,甚至有工作代碼:)
如果您只有原始項目池中每個項目的一個實例,並且您的項目表示二進制數字;
var items {
1 : 1,
2 : 1,
4 : 1,
8 : 1,
16: 1,
32: 1
};
這個問題將被簡化爲生成能夠通過這些數字來表示的所有數字的序列:
- 0([] - 沒有物品)
- 1([1])
- 2([2])
- 3([2,1])
- 4([4])
- ë TC
所以,你的問題可以被看作是簡單的要求,可以通過表示的數字序列 - 而不是二進制 - 但mixed-radix數字系統。
這意味着,你可以爲這個奇怪的編號系統寫一個計數器,以遍歷值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
---- snip ----
2
1,2
1,1,2
---- big snip ----
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
你的意思是「不是每個項目都必須存在於結果中?」你在找什麼樣的結果? – 2009-04-17 06:31:45