摘要:
参考资料:http://blog.csdn.net/e3399/article/details/7543861如果要求C(n,m),例如C(5,2)=5!/(2!*3!)=10,就参考http://www.cnblogs.com/qrlozte/p/3497035.html如果要求P(n,n),例如P(3,3)=3!=6,就使用本文章提到的全排列算法如果要求P(n,m),例如P(5,2)=5!/(5-2)!=20,就先求C(n,m),然后对每一个组合求P(m,m)即可,因为P(n,m)=C(n,m)*P(m,m)1.非递归实现 next_permutation 1.1 基本思想 注:此... 阅读全文
摘要:
void swap(int *a, int i, int j){ a[j] ^= a[i]; a[i] ^= a[j]; a[j] ^= a[i];}异或运算定律: 0XOR 0 = 0 0 XOR 1 = 1 1 XOR 0 = 1 1 XOR 1 = 0 a XOR b = b XOR a // 交换律 (a XOR b) XOR c = a XOR (b XOR c) // 结合律计算过程:设a[i]为x,a[j]为y a[i] ^= a[j]; // a[i]==(x ^ y) a[j] ^= a[i]; // a[j]==(y^(x^y))==(y^... 阅读全文
摘要:
参考资料:http://blog.csdn.net/sharpdew/article/details/755074实际上这个算法的思路就是如下,举例说明比较直观一些,比如说计算{1,2,3,4,5}的3位组合搜索过程如下 以order数组的内容为例,order[1]就指向a[0],order[2]指向a[1]以此类推 order是一个数组,用来存放组合数在a[]中下标,order[0]作为一个flag来控制迭代循环何时结束,order[i]表示a[i-1],通过修改order的内容来寻找组合,实际上跟直接找a[i]的组合是一样的 下划线表示回溯,黑体表示新的值,不符合要求的搜索结果用划掉... 阅读全文