暴力--全排列+排列组合+组合(求子集)

1、遍历全排列

法一:STL  next_permutation(a,a+4);

法二:

 void permutation(int begin,int end){
    if(begin==end){
        num++;
    }
    else{
        for(int i=begin;i<=end;i++){
            swap(s[begin],s[i]);
            permutation(begin+1,end);
            swap(s[begin],s[i]);
        }
    }
}

 

 

2、排列组合

例如求n个数中取5个的全排列,只需把上面if中end改为5+1

 

3、组合(利用二进制数,妙得很)

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cctype>
using namespace std;

int main(){
    int n,ans=0;
    cin>>n;                      //集合的子集数 
    
    for(int i=0;i<(1<<n);i++){   //含八个元素的集合的所有子集 
        int num=i;
        int count=0;
        while(num){
            num&=(num-1);        //把二进制数的最后一个1变成0 
            count++;
        }
        if(count==3)             //如果是8个元素中取三个的情况 
        ans++;
    }
    cout<<ans;
    
    return 0;
}

 

posted @ 2018-03-12 19:46  柳暗花明_liu  阅读(220)  评论(0编辑  收藏  举报