暴力--全排列+排列组合+组合(求子集)
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; }
柳暗花明又一村