输出N个数中取M个数的所有组合,排列情况
2011-12-30 12:46
344 查看
一般思路是由组合算排列,现在借助Next_permutation函数由排列到组合。
1.组合
读入一个字符串,一个整数n,输出字符串中取n个字符的所有组合情况
算法:借助Next_permutation函数,构造一个大小为len=str.length()的数组,0表示要输出的数,1表示不要输出的数。
代码如下:
2.排列
排列回溯:
1.组合
读入一个字符串,一个整数n,输出字符串中取n个字符的所有组合情况
算法:借助Next_permutation函数,构造一个大小为len=str.length()的数组,0表示要输出的数,1表示不要输出的数。
代码如下:
#include <iostream> #include <string> #include <algorithm> #include <memory.h> using namespace std; int main() { string str; int n; cin>>str>>n; int len=str.length(); int a[100]; memset(a,1,sizeof(a)); for(int i=0;i<n;i++) a[i]=0; do { for(int i=0;i<len;i++) { if(a[i]==0) cout<<str[i]; } cout<<endl; }while(next_permutation(a,a+len)); system("pause"); return 0; }
2.排列
#include <iostream> #include <string> #include <algorithm> #include <memory.h> using namespace std; int main() { string str; int n; cin>>str>>n; int len=str.length(); int a[100]; char b[100]; memset(a,1,sizeof(a)); for(int i=0;i<n;i++) a[i]=0; do { int j=0; for(int i=0;i<len;i++) { if(a[i]==0) { b[j]=str[i]; j++; } } do { for(int i=0;i<j;i++) cout<<b[i]; cout<<endl; }while(next_permutation(b,b+j)); cout<<endl; }while(next_permutation(a,a+len)); system("pause"); return 0; }
排列回溯:
#include <iostream> using namespace std; const int n=4;//总的元素数 const int m=3;//需要排列的元素个数 int num[m];//记录状态的数组,保存各个位置的排列元素 bool is_valid(int count) //判断第count次取数是否合理 { for(int i=0;i<count;++i) { if(num[i]==num[count]) { return false; } } return true; } void choose_num(int count) //第count次选数 { if(count==m)//选取的排列元素够了 { for(int i=0; i<m; ++i) { cout<<num[i]; } cout<<endl; return; } for(int i=1;i<=n;++i)//如果没选够,选择一个数,合理后递归调用 { num[count]=i; if(is_valid(count)) { choose_num(count+1); } } } int main() { choose_num(0); }
相关文章推荐
- 输出字符串的所有排列组合情况
- 任意数字、字符序列,输出它们所有的排列组合
- 输出所有排列组合
- 输出字符串的所有排列组合
- 输出一个string的所有排列情况
- 输出前M个字母中任取N个的所有组合情况
- 输出数组的所有元素的排列组合(递归)
- 输出1,2,2,3,4,5的所有排列组合,4不能在第3位,3和5不能相邻
- 任意数字序列“123456”之类,输出它们所有的排列组合
- 输出4个整数(不重复)的所有排列组合
- 比如“1,2,3....10”,1到10这10个数,显示他的所有可能组合情况(排列顺序无所谓)
- 输入N个数,输出所有可能的排列组合(6+个小时啊,耶稣~)
- 输出1,2,2,3,4,5的所有排列组合,4不能在第三位,3和5不能相邻
- 输出1,2,2,3,4,5的所有排列组合,4不能在第三位,3和5不能相邻
- 输出n对括号的所有有效排列组合
- 面试题:输出1,2,2,3,4,5的所有排列组合,4不能在第三位,3和5不能相邻
- 输出1,2,2,3,4,5的所有排列组合,4不能在第三位,3和5不能相邻
- 八皇后问题(DFS加回溯)输出排列的所有情况
- 基于排列与组合输出多少中情况详解
- 求出一组元素的所有排列情况&所有包含m个元素组合情况&网易笔试题-合唱团