暴力!!!!
子集生成
增量构造法
#include<stdio.h>
bool a[100];
bool vis[100];
int n;
void dfs(int num){
if(num==n+1)
{
for (int i=1;i<=n;i++)
// if(a[i])
printf("%d ",a[i]);
printf("\n");
return ;
}
for (int i=1;i<=2;i++){
if(i==1){
a[num]=0;
dfs(num+1);
}
else {
a[num]=1;
dfs(num+1);
a[num]=0;
}
}
}
int main(){
scanf("%d",&n);
dfs(1);
return 0;
}
二进制构造
位运算
A&B 交集
A|B 并集
A^B 对称差
#include<stdio.h>
bool a[100];
bool vis[100];
int n;
void dfs(int num){
for (int i=0;i<=n;i++){
if(num&(1<<i)) printf("%d ",i+1);
//else printf("%d ",0);
}printf("\n");
}
int main(){
scanf("%d",&n);
for (int i=0;i<(1<<n);i++)
dfs(i);
return 0;
}
全排列
#include<stdio.h>
int a[1000];
int n;
void dfs(int num){
if(num==n+1){
for (int i=1;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
return ;
}
for (int i=1;i<=n;i++){
int ok=1;
for (int j=1;j<=num;j++){
if(a[j]==i) ok=0;
}
if(ok){
a[num]=i;
dfs(num+1);
a[num]=0;
}
}
}
int main(){
scanf("%d",&n);
dfs(1);
return 0;
}
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char a[10000];
int n;
int main(){
//scanf("%d",&n);
scanf("%s",a);
n=strlen(a);
sort(a,a+n);
do{
for (int i=0;i<n;i++)
printf("%c ",a[i]);
printf("\n");
}while(next_permutation(a,a+n));
return 0;
}