排列組合問題

2022-09-04 02:51:10 字數 2322 閱讀 7216

**部落格:  

**見problem28

問題1 :輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a、b、c所能排列出來的所有字串abc、acb、bac、bca、cab和cba。

思路:這是個遞迴求解的問題。遞迴演算法有四個特性:(1)必須有可達到的終止條件,否則程式將陷入死迴圈;(2)子問題在規模上比原問題小;(3)子問題可通過再次遞迴呼叫求解;(4)子問題的解應能組合成整個問題的解。

對於字串的排列問題。如果能生成n - 1個元素的全排列,就能生成n個元素的全排列。對於只有1個元素的集合,可以直接生成全排列。全排列的遞迴終止條件很明確,只有1個元素時。下面這個圖很清楚的給出了遞迴的過程。

參考**:解法1通過permutation_solution1(str, 0, n); 解法2通過呼叫permutation_solution2(str, str)來求解問題。

view plain

copy to clipboard

//函式功能 : 求乙個字串某個區間內字元的全排列

//函式引數 : pstr為字串,begin和end表示區間

//返回值 :   無

void

permutation_solution1(

char

*pstr, 

intbegin, 

intend)  

else

}  }  //函式功能 : 求乙個字串某個區間內字元的全排列

//函式引數 : pstr為字串,pbegin為開始位置

//返回值 :   無

void

permutation_solution2(

char

*pstr, 

char

*pbegin)  

else

}  }  //提供的公共介面

void

permutation(

char

*pstr)  

[cpp]

view plain

copy

//函式功能 : 求乙個字串某個區間內字元的全排列//函式引數 : pstr為字串,begin和end表示區間//返回值 :   無void permutation_solution1(char *pstr, int begin, int end)  

//選擇這個元素

result.push_back(*pstr);  

combination_m(pstr + 1, m - 1, result);  

result.pop_back();  

//不選擇這個元素

combination_m(pstr + 1, m, result);  

}  //函式功能 : 求乙個字串的組合

//函式引數 : pstr為字串

//返回值 :   無

void

combination(

char

*pstr)  

}  [cpp]

view plain

copy

//函式功能 : 從乙個字串中選m個元素//函式引數 : pstr為字串, m為選的元素個數, result為選中的//返回值 :   無void combination_m(char *pstr, int m, vector&result)}

問題3:打靶問題。乙個射擊運動員打靶,靶一共有10環,連開10 槍打中90環的可能性有多少?

思路:這道題的思路與字串的組合很像,用遞迴解決。一次射擊有11種可能,命中1環至10環,或脫靶。

參考**:

view plain

copy to clipboard

//函式功能 : 求解number次打中sum環的種數

//函式引數 : number為打靶次數,sum為需要命中的環數,result用來儲存中間結果,total記錄種數 

//返回值 :   無

void

shootproblem_solution1(

intnumber, 

intsum, vector<

int> &result, 

int*total)  

else

return

;  }  

for(unsigned i = 0; i <= 10; i++) 

//命中0-10環

}  //提供的公共介面

void

shootproblem(

intnumber, 

intsum)  

排列組合問題

若有一串字母abc,進行全排列,有六種方法,3的階層,321,為什麼是這樣呢,我們根據 看思路 這之間會涉及遞迴,回溯 將abc看成陣列,a 0 a,a 1 b,a 2 c 下文中用a0代替a,a1代替b,a2代替c 排列的過程就是交換位置的過程 1 先對a進行交換 即k 0時 a0和a0自己交換 ...

排列組合問題

基本的排列組合問題,就是高中數學的內容,怎麼用程式語言輸出所有排列呢?我們手寫的過程,它應該是乙個遞迴的過程,而不適合用for wihle迴圈。如果資料結構學的紮實,可以發現這是乙個樹結構,遍歷所有的葉子節點就能夠得到全排列。說到遞迴,應該向大家隆重介紹一下數學歸納法的思想,應為都有乙個問題規模n。...

排列組合問題

這資料寫個暴力都拿不了30分 t t。c n,i c n,i c n,i c n,n i 結合現實意義,在n個裡面選 i 個,再在n個裡面選n i個的方案數。就等價於在前n個中選 i 個,在後n各種選n i個。而且i 0 n 在2 n各種選n個。那麼 c 2 n,n 答案要對1000000007取模...