组合的算法
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)
不知道我这样说你能不能听明白