2012-05-03 22 views
-1

我有一個數組/數組列表。每個號碼都有一定的優先級/重要性。數字與重量的組合

我需要一種算法來生成數字的所有組合,但開始以最重要的形式編號。

e.g. [number, priority]: [1,1], [2,3], [3,2]. Highest priority is 1. 

組合:

1, 3, 2, 1 1, 1 3, 3 3, 3 1, 1 2, 3 2, 2 1, 2 2, 1 1 1, 1 1 3, 1 3 1... 

任何想法如何做到這一點? 當然,我想要生成一定數量的組合。

+0

你有代碼產生簡單的排列嗎?如果是這樣,你嘗試了什麼樣的修改?如果沒有,那麼做,然後更新問題。 – Jon

+0

我沒有代碼,因爲我試圖創建一個僞代碼整個算法 – galica

+0

你想要什麼?這並不完全清楚。我猜'1,3,2'是你的原始數字,按照wrt排序。優先?但那麼'1 3'是什麼?你真的是指組合,而不是排列? – Henrik

回答

1

我改變了我對示例代碼的回答,這樣你甚至不需要遞歸。您必須首先按優先級排序元素。這個例子是在Perl中,它不是很遠,僞代碼

@numbers = (1, 3, 2, 4); 

push(@result, @numbers); 
push(@working_list, @numbers); 
for ($i = 1; $i < @numbers; $i++) { # We loop exactly for the length of the array (-1 because the first iteration is already inside) 
    my @result_list; 
    for $result (@working_list) { # get the result of the last iteration of $i 
     for $number (@numbers) { # iterate the numbers 
      push (@result_list, "$result $number"); # adding the numbers 
     } 
    } 

    push(@result, @result_list); # push the last result to final result list 
    undef @working_list; 
    push(@working_list, @result_list); # use the last result as a start point for next $i iteration 

} 

print join(', ', @result); 
1

看來你正在尋找並非所有組合的所有組合(我沒有看到任何重複的數字集,所以你只關心數字集,但不關心該集內的順序)。

這裏有一個給你的提示 - 首先寫下代碼,它將產生數字1到n的所有可能的組合,然後在這些數字和你給出的權重之間做一個簡單的雙射。

+0

他的例子包括(1 3)和(3 1),所以他清楚地區分了數字的順序。你可以試着爭辯說,第一個數字是n,第二個數字是優先級,但是你不會有(1 1)和(1 3)。 Imho的問題沒有明確說明,在當前狀態下無法回答。 –