组合问题(不含有重复元素)

    科技2024-06-14  77

    文章目录

    一、初识组合二、组合代码描述1.简单的组合数量问题2.枚举出每一种的组合情况3.使用next_permutation枚举出所有组合结果


    一、初识组合

    可以参考:https://www.cnblogs.com/fengxunling/p/9687162.html

    二、组合代码描述

    1.简单的组合数量问题

    描述:从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; }

    2.枚举出每一种的组合情况

    使用抽取法列举出每一种组合排序的情况。通常将组合的结果放入新的结果数组中,从原始数组中抽取元素放入结果数组中。 代码如下(示例):

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

    3.使用next_permutation枚举出所有组合结果

    将大格子的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; }
    Processed: 0.014, SQL: 8