可以参考:https://www.cnblogs.com/fengxunling/p/9687162.html
描述:从n个里面选择m个进行相关组合排序,不考虑m个元素的位置。 代码如下(示例):
#include <bits/stdc++.h> using namespace std; int res=0; int f(int n,int m){ if(m==0){ return 1; }else if(n==m){ return 1; }else{ return f(n-1,m-1)+f(n-1,m); //使用了相关排列组合的相关等式进行相应的递归算法 } } int main(){ int n,m; cin>>n>>m; cout<<f(n,m)<<endl; return 0; }使用抽取法列举出每一种组合排序的情况。通常将组合的结果放入新的结果数组中,从原始数组中抽取元素放入结果数组中。 代码如下(示例):
#include <bits/stdc++.h> using namespace std; int n,m; int number=0; //组合排序种类数 void f(string a,char b[],int n,int q,int p){ if(p>=m){ cout<<b<<endl; number++; return; } for(int i=q;i<n;i++){ b[p]=a[i]; f(a,b,n,i+1,p+1); //因为i之前的元素已经考虑过了,放置下一个位置的要从i+1开始(处理i之前的时候,若放了,则不会再放,若没放,也不会在放) } } int main(){ string a; char b[15]=""; cin>>a; n=a.length(); cin>>m; f(a,b,n,0,0); cout<<number<<endl; return 0; }将大格子的k个空格填充,用排列来模拟填充情况,可以获得不同的填充方式,每一种填充方式就是每一种组合情况,注意数组的初始化。 代码如下(示例):
#include <bits/stdc++.h> using namespace std; int main(){ char a[15]="abcd"; char b[15]=""; int n=4,m=3; int used[15]={0,1,1,1}; do{ for(int i=0;i<n;i++){ if(used[i]){ cout<<a[i]; } } cout<<endl; }while(next_permutation(used,used+n)); return 0; }