排列組合問題

1. 基本排列A(n, m)的實現
1)應用窮舉是比較容易實現的
2)這裏用回溯法解決此題(回溯法簡介http://baike.baidu.com/view/45.htm
算法思路:
①設置一維a數組,a在1~n中取值,出現數字相同時返回
②當i<m時,還未取m個數,i增加1後a(i)=1繼續;當i=m時,輸出一個A(n, m)的排列,並設置變量s統計A(n, m)排列的個數(這個其實可以用數學公式直接計算
③當a(i)<n時a(i)增1繼續;當a(i)=n時回溯或調整,直到i=0時結束。
3)代碼

 

 

4)程序變通
①若將a[j]==a修改爲a[j]>=a就能實現從n個不同元素中取m個的組合
②把以上程序中的輸出語句“printf("%d", a[j])“改爲“printf("%c", a[j]+64)”,排列(或組合)輸出由前n個整數改變爲前n個大寫英文字母輸出。
③將該語句改成printf("%c", n+65-a[j]),排列(或組合)輸出由前n個正整數改變爲前n個大寫英文字母逆序輸出。

 

2.特殊情況

   問題描述:從n個不同元素中取m個元素與另n-m個相同元素的排列,如:如何從4個不同數字1、2、3、4中取2個數字與另2個“0”的排列?

   一般地,探討實現從n個不同元素中取m(約定1<m<=n)個元素與另外n-m個相同元素組成的排列。

  設n個不同元素爲數字1~n,n-m個相同元素爲n-m個元素0.

  設置一維數組,應用回溯法產生由數字0~n這n+1個元素取n個數字組成的n元組,若非0元素(即數字1~n)有重複時捨去;引入了一個變量k來控制0的個數,使它不超過n-m。餘下的即從數字1~n中取m個不同數字與n-m個0的排列,進行打印出來

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章