排列组合

· · 个人记录

1.加法原理与乘法原理

2.排列

例:P1706 全排列问题

//深搜过程
void dfs(int index){
    if(index>n){
        for(int i=1;i<=m;i++)
            printf("%5d",ans[i]);
        printf("\n");
        return ;
    }
    for(int i=1;i<=n;i++)
        if(!use[i]){
            ans[index]=i;
            use[i]=true;
            dfs(index+1);
            use[i]=false;//恢复现场
            ans[index]=0;
        }
    return ;
}
#include<bits/stdc++.h>
using namespace std;

int main(){
    int n;
    int a[25];
    scanf("%d",&n);
   int m=1;
   for(int i=2;i<=n;i++)
        m*=i;
    for(int i=0;i<n;i++)
        a[i]=i+1;
    while(m--){
        next_permutation(a,a+n);//全排列函数
      for(int i=0;i<n;i++)
            printf("%5d",a[i]);
   }
    return 0;
}

3.组合

例:P1157 组合的输出

//深搜过程
void dfs(int index){
    if(index>m){
        for(int i=1;i<=m;i++)
            printf("%3d",ans[i]);
        printf("\n");
        return ;
    }
    for(int i=ans[index-1]+1;i<=n;i++)
        if(!use[i]){
            ans[index]=i;
            use[i]=true;
            dfs(index+1);
            use[i]=false;
            ans[index]=0;
        }
    return ;
}