c++ 深搜

深搜

枚举二进制

#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;
} 
posted @ 2022-01-19 12:00  KevinLikesCoding  阅读(197)  评论(1编辑  收藏  举报