組合演算法:
舉個例子:求cnm(即在n個元素找m個元素組合) 可以這樣遞迴:
對某乙個元素來說,我們可以選擇他,此時剩下n-1個元素,從中找出m-1個元素。也可以不選擇這個元素,此時在剩下的n-1個元素中,我們需要從中尋找m個元素。這兩種情況相加即為最終結果。**實現如下:
/**
* 假設 n個球中有乙個特殊的 我們抓到的球中必須要有這個特殊的
* 則這裡分成兩種情況
* 1.抓到特殊的,則下一次再 n - 1 個中找m - 1 個
* 2.沒抓到特殊的,則下一次再n - 1個中找到m個
*/private static int combine(int n, int m)
if (n == m)
if (m == 0 )
return combine( n - 1 , m - 1) + combine( n - 1 , m);
}
排列演算法:
舉個例子:求anm,即在n個元素中,找到m個元素進行全排列。我哪字串做乙個模擬,即輸入乙個字串,輸出這個字串的所有全排列。
思路是這樣子的,首先,拿陣列的第乙個元素與陣列的第二個元素交換,之後,遞迴呼叫這個函式,但要將陣列變為原來的陣列的第二個元素到最後乙個元素。我們可以設定乙個起始下標,這樣就不用每次建立新的陣列了。在這次操作結束後,在將第乙個元素再與第三個元素交換,在遞迴呼叫。。。一直到最後乙個元素交換在交換完成。這裡乙個比較容易出錯的地方是要記得回溯,當我們交換完元素並且遞迴呼叫之後,一定要記得恢復原來的樣子,否則的話會影響下次操作。**如下:
/*
* 假設有乙個大小為n的陣列從中找m個元素的全排列
* 以abc為例
* abc
* acb
* bac
* bca
* cba
* cab
* 則原理如下:
* 首先:
* 第乙個元素分別與第乙個 第二個。。。。。。第length -1 個元素交換位置
* 在傳遞去掉第一位元素剩下的陣列,遞迴呼叫
* * 結束位置:當入口陣列大小為1時 結束
* * @param n
* @param m
* @return
*/private static void arrange(char n, int m)
//這裡為了節省新建陣列的空間,我們用m來表徵陣列頭,通過m的變化來表徵新陣列
for (int i = m; i < n.length; i++)
}
8 排列組合
1 2 permutations 3 排列組合 4 輸入abc,輸出所有可能的排列結果 5 輸入 abc 6 輸出 abc 7 acb 8 bac 9 bca 10 cab 11 cba 12 1314 include15 16using namespace std 1718 int c1 0 19...
藍橋杯 排列組合問題
題目 有一次,老師出的題目是 36 x 495 他卻給抄成了 396 x 45 但結果卻很戲劇性,他的答案竟然是對的!因為 36 495 396 45 17820 類似這樣的巧合情況可能還有很多,比如 27 594 297 54 假設 a b c d e 代表1 9不同的5個數字 注意是各不相同的數...
hdu 1716 排列2 排列組合
問題描述 ray又對數字的列產生了興趣 現有四張卡片,用這四張卡片能排列出很多不同的4位數,要求按從小到大的順序輸出這些4位數 input 每組資料佔一行,代表四張卡片上的數字 0 數字 9 如果四張卡片都是0,則輸入結束。output 對每組卡片按從小到大的順序輸出所有能由這四張卡片組成的4位數,...