全排列算法(递归实现) 组合算法(递归,位运算实现)
2017-08-23 17:27
337 查看
//……………………………..全排列…………………….
//………………………………….组合算法………………………………
//………………………1.递归方式实现
/*
解题思路:因为要求集合里的元素所能够组成的所有组合,所以我们需要遍历该集合,
这里假设我们的集合为”abc”,从头扫描集合里的元素,第一个元素为a,对于这个元素,
有两种选择,一种是将字符放到组合中,然后在剩下的n-1个字符中选取m-1个字符
另一种是不把字符放到组合中去,接下来需要在剩下的n-1个字符中选取m个字符
*/
//………………………..2.位运算…………..
分析组合规律可以发现,
当集合个数为2时,有3(2^2-1)种组合方式;
当集合个数为3时,有7(2^3-1)种组合方式;
当集合个数为4时,有15(2^4-1)种组合方式;
又直到1<
4000
#include<iostream> using namespace std; //判断要交换的两个数是否相等,如果相等就不进行交换 bool IsSwap(int list[],int begin,int end) { for(int i = begin;i<end;i++) if(list[i] == list[end]) return false; return true; } void Perm(int list[],int k,int m) { if(k == m) { for(int i =0;i<m;i++) cout<<list[i]; cout<<endl; } else { for(int i = k;i<m;i++) { if(IsSwap(list,k,i)) { swap(list[k],list[i]); Perm(list,k+1,m); //递归计算k+1到m的全排列 swap(list[k],list[i]); } } } } int main() { int arr[] = {1,2,2}; cout<<"arr数组全排列的结果是:"<<endl; Perm(arr,0,3); return 0; }
//………………………………….组合算法………………………………
//………………………1.递归方式实现
/*
解题思路:因为要求集合里的元素所能够组成的所有组合,所以我们需要遍历该集合,
这里假设我们的集合为”abc”,从头扫描集合里的元素,第一个元素为a,对于这个元素,
有两种选择,一种是将字符放到组合中,然后在剩下的n-1个字符中选取m-1个字符
另一种是不把字符放到组合中去,接下来需要在剩下的n-1个字符中选取m个字符
*/
#if 1 void Combination(char* string,int number,vector<char>& result) { if(number == 0) { vector<char>::iterator iter = result.begin(); for(;iter<result.end();++iter) cout<<*iter; cout<<endl; return ; } if(*string == '\0') return ; result.push_back(*string); Combination(string+1,number-1,result); //将字符放到组合当中 result.pop_back(); Combination(string+1,number,result); //不把字符放到组合当中 } void Combination(char* string) { if(string == NULL) return ; int length = strlen(string); vector<char>result; for(int i = 1;i<=length;++i) { Combination(string,i,result); } } int main() { char* string = "abcd"; Combination(string); return 0; } #endif
//………………………..2.位运算…………..
分析组合规律可以发现,
当集合个数为2时,有3(2^2-1)种组合方式;
当集合个数为3时,有7(2^3-1)种组合方式;
当集合个数为4时,有15(2^4-1)种组合方式;
又直到1<
#if 1 int main() { string s ; cin>>s; int len = s.size(); int bit = 1<<len; //所有组合种类个数 int t; //两个for循环依次将所有组合情况列举出来 for(int i= 0;i<bit;i++) { for(int j = 0;j<len;j++) { t = 1<<j; if((t&i)!=0) { cout<<s[j]; } } cout<<endl; } } #endif
4000
相关文章推荐
- 【转】全排列算法非递归实现和递归实现
- 全排列算法递归实现 C++
- 递归实现的全排列算法
- 全排列算法非递归实现和递归实现
- LeetCode:Permutations(全排列算法的递归与非递归实现)
- 组合算法实现C语言,非递归
- 全排列算法的递归实现
- 全排列算法的递归思想及实现
- 全排列算法的递归与非递归实现
- 组合算法的实现,递归,C语言
- 全排列算法的递归与非递归实现
- 全排列算法【非递归活动数实现】
- 全排列算法的非递归实现与递归实现的方法(C++)
- 全排列算法(字典序,递归实现)
- 全排列算法的递归与非递归实现
- 全排列算法-递归与字典序的实现方法(Java)
- 递归实现全排列算法
- 全排列算法非递归实现和递归实现
- 全排列算法的非递归实现
- 快速排序的js递归实现