深搜
枚举二进制
#include <bits/stdc++.h>
using namespace std;
int n,a[10];
void dfs(int t){
if(t==n){
for(int i=0;i<n;i++) cout << a[i];
cout << endl;
return;
}
a[t]=0;
dfs(t+1);
a[t]=1;
dfs(t+1);
}
int main(){
cin >> n;
dfs(0);
return 0;
}
输入
3
输出
000
001
010
011
100
101
110
111
枚举数的全排列
#include <bits/stdc++.h>
using namespace std;
int n,a[10],b[10];
void dfs(int t){
if(t==n){
for(int i=0;i<n;i++) cout << a[i];
cout << endl;
return;
}
for(int i=1;i<=n;i++){
if(b[i]==0){
a[t]=i;
b[i]=1;
dfs(t+1);
b[i]=0;
}
}
}
int main(){
cin >> n;
dfs(0);
return 0;
}
输入
3
输出
123
132
213
231
312
321
NOIP2002 普及组 选数
#include <bits/stdc++.h>
using namespace std;
const int N=25;
int n,k,a[N],b[N],ans,s;
bool p(int x){
if(x<2) return 0;
for(int i=2;i*i<=x;i++){
if(x%i==0) return 0;
}
return 1;
}
void dfs(int t, int m){
if(t==n){
if(k==m){
s=0;
for(int i=0;i<n;i++){
if(b[i]) s+=a[i];
}
if(p(s)) ans++;
}
return;
}
b[t]=0;
dfs(t+1, m);
b[t]=1;
dfs(t+1, m+1);
}
int main(){
cin >> n >> k;
for(int i=0;i<n;i++){
cin >> a[i];
}
dfs(0, 0);
cout << ans;
return 0;
}