输出N个数中取M个数的所有组合,排列情况

来源:互联网 发布:am域名投资 编辑:程序博客网 时间:2024/05/29 10:55

一般思路是由组合算排列,现在借助Next_permutation函数由排列到组合。

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); } 


原创粉丝点击