組合的演算法
A. 全組合的演算法
總共有26*10*26種可能,如果把沒一個A、B、C的取值進行編號,那麼序號與A、B、C的關系可以是:
序號I=26*26*B+26*A+C=26(26B+A)+C
那麼:
C=I%26
A=(I-C)/26%26
B=(I-C-26A)/26/26
用一重循環來實現上述組合的枚舉,程序如下:
main(){
int i,a,b,c;
for (i=0;i<26*10*26;i++){
c=i%26;
a=(i-c)/26%26;
b=(i-c-26*a)/26/26;
printf("%c%c%c ",a+'A',b+'0',c+'A');
}
}
這實際上是使用的26進制數來實現的,這個26進制三位數是BAC,值等於I,當有更多變數的時候,方法是類似的。
B. 求組合演算法.
思路1(沒實現):這題越做越明白,最後一個全組合問題我沒解決好~我是這樣想的:求出全排列-->對於所有全排列所有單個元素一個組合(共有N個元素就N個組合)-->對於所有全排列所有元素組成(N-1)個可能的組合-->對於所有全排列所有元素組成(N-2)個可能的組合-->-->到所有元素一個組合這樣做有個問題是重復問題,因為是對所有元素組合,思路2:求出這幾個元素的所有可能組合,然後在輸出結果的時候遍歷所有組合,將所有組合聯合起來和輸入的數據一致。比如:{a,b}組合,遍歷所有組合後加上一個{c}即可和輸入一致每個組合都為一行,然後去匹配以下我思路1的未代碼:/*思路:得到輸入字元串不重復全排列,然後逐層組合*/#include#includeusingnamespacestd;/*將輸入轉字元串格式*/voidInput2Str(char*dest,char*input){intlen=strlen(input);for(inti=0;i&result){if(*begin=='\0'){result.push_back(str);}else{for(char*pCh=begin;*pCh!='\0';pCh++){if(IsSwap(begin,pCh)){swap(*begin,*pCh);Perm(str,begin+1,result);swap(*begin,*pCh);}}}}voidprint(vector&result){cout::iteratoriter=result.begin();intlen=strlen((*iter).c_str());for(;iter!=result.end();++iter){cout>input;Input2Str(inputStr,input);vectorresult;Perm(inputStr,inputStr,result);print(result);return0;}
C. 組合c的計算公式是什麼
排列組合c的公式:C(n,m)=A(n,m)/m!=n!/m!(n-m)!與C(n,m)=C(n,n-m)。(n為下標,m為上標)。例如C(4,2)=4!/(2!*2!)=4*3/(2*1)=6,C(5,2)=C(5,3)。
排列組合c計算方法:C是從幾個中選取出來,不排列,只組合。
C(n,m)=n*(n-1)*...*(n-m+1)/m!
例如c53=5*4*3÷(3*2*1)=10,再如C(4,2)=(4x3)/(2x1)=6。
注意事項:
1、不同的元素分給不同的組,如果有出現人數相同的這樣的組,並且該組沒有名稱,則需要除序,有幾個相同的就除以幾的階乘,如果分的組有名稱,則不需要除序。
2、隔板法就是在n個元間的n-1個空中插入若干個隔板,可以把n個元素分成(n+1)組的方法,應用隔板法必須滿足這n個元素必須互不相異,所分成的每一組至少分得一個元素,分成的組彼此相異。
3、對於帶有特殊元素的排列組合問題,一般應先考慮特殊元素,再考慮其他元素。
D. 組合演算法是什麼
組合演算法指計算對象是離散的、有限的數學結構的組合學問題的演算法。組合演算法的用途十分廣泛。從方法學的角度,組合演算法包括演算法設計和演算法分析兩個方面,關於演算法設計,已經總結出若干帶有普遍意義的方法和技術,包括動態規劃、回溯法、分枝限界法、分治法、貪心法等。
組合演算法的設計仍然是一門藝術需要高度的技巧和靈感。演算法分析的任務是分析演算法的優劣,主要是討論演算法的時間復雜性和空間復雜性。它的理論基礎是組合分析,包括計數和枚舉。計算復雜性理論,特別是NP完全性理論,與組合演算法是緊密相關的。
(4)組合的演算法擴展閱讀:
組合演算法要解決的問題只有有限種可能,在沒有更好辦法時總可以用窮舉搜索的辦法來解決,即逐個檢查所有可能的情況。當情況較多時這樣做是很費時的。
實際上並不需要機械地檢查每一種情況,常常有可能提前判斷出某些情況不可能取到最優解,從而可以提前舍棄這些情況。這樣使「隱含地」檢查了所有情況,既減少了搜索量,又保證不漏掉最優解。
E. 什麼是組合演算法和組合問題
給你解釋下 A(4,6)的意思 A(4,6)的意思是對6個數中的4個做組合的情況個數
首先,第一個數的位置有多少種情況?是6種,在這之後第二個數呢,因為第一個數占據了一個位置所以是5種 以此類推後面是4、3種 那為什麼是6*5*4*3呢 而不是6+5+4+3呢 因為這四個事件不是互斥的
C(4,6) = A(4,6) / (4 * 3 * 2 * 1) 為什麼要除以4 * 3 * 2 * 1呢 C(4,6)的意思是從6個數中取出4個數 但是不要求排序 這點是和A是有區別的 因為A(4,6)不僅取出了4個數而且對4個數進行了排序 也就是說在C(4,6)中每次從6個數中取出4個數的情況數是1 而在A(4,6)中的情況數卻是A(4,4) 所以這個比例關系是 1:A(4,4)的關系 所以要除以A(4,4) 也就是C(4,6) = A(4,6) / A(4,4)
不知道我這樣說你能不能聽明白