数据型DFS 小合集

A-P2036 [COCI2008-2009#2] PERKET

#include
using namespace std;
const int N = 50;
const int INF = 0x3f3f3f3f;

int n,ans = INF;
int acid[N],sweet[N];

void DFS(int i,int x,int y){
     
	
	if(i > n){
     
		if(x == 1 && y == 0)return;
		ans = min(ans,abs(x - y));
		return;
	}
	
	DFS(i + 1,x * acid[i],y + sweet[i]);
	DFS(i + 1,x,y);
	
}

int main(){
     
	
	cin>>n;
	for(int i = 1;i <= n;i++)cin>>acid[i]>>sweet[i];
	
	DFS(1,1,0);
	
	cout<<ans<<endl; 
} 

B-H1016 素数环(DFS+素数筛)

#include
#include
#include
#include
#define ms(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N = 51;

int n,cnt;
int prime[N];
bool vis[N];
int ans[N];

void prime_set(){
     //素数筛 
	
	for(int i = 2;i <= sqrt(N);i++)
		if(!prime[i])for(int j = 2;i * j <= N;j++)prime[i * j] = 1;
		
	prime[1] = 0,vis[1] = true;
}

void DFS(int step){
     
	
	//出口 
	if(prime[ans[step - 1] + ans[step - 2]])return;
	if(step == n + 1 && prime[ans[n] + 1])return;
	
	//结束输出 
	if(step == n + 1){
     
		for(int i = 1;i < n;i++)cout<<ans[i]<<" ";
		cout<<ans[n]<<endl;
		
	}
	
	//搜索 
	for(int i = 2;i <= n;i++){
     
		if(!vis[i]){
     
			
			vis[i] = true;
			ans[step] = i;//赋值 
			DFS(step + 1);
			vis[i] = false;//回溯 
		}
	}
}

int main(){
     
	
	prime_set();
	
	while(~scanf("%d",&n)){
     
		
		ms(vis,false);
		
		cout<<"Case "<<++cnt<<":"<<endl;
		
		ans[1] = 1;
		if(n == 1)cout<<"1"<<endl;
		else DFS(2);
		
		cout<<endl;
	}
	
	return 0;
}

C-H1258 Sum It Up

#include
#include
#include
#define ms(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N = 15;
//去重 难点 
int t,n;
int num[N],ans[N],flag;
bool vis[N];

void DFS(int place,int x,int sum){
     
	
	if(sum == t){
     
		
		flag = 1;
		if(x == 1)cout<<ans[1]<<endl;
		else{
     
			for(int i = 1;i < place - 1;i++)cout<<ans[i]<<"+";
			cout<<ans[place - 1]<<endl;
		}
		return;
	}
	
	if(x > n || sum > t)return;//写在前面的话可能正好 x == n + 1 这种情况会漏掉 
	
	ans[place] = num[x];
	DFS(place + 1,x + 1,sum + num[x]);
	
	while(x < n && num[x] == num[x + 1])x++;//??????
	DFS(place,x + 1,sum); //???? 真没看懂 
	
}

int main(){
     
	
	while(true){
     
		
		flag = 0;
		ms(vis,false);
		
		cin>>t>>n;
		if(!n)break;
		for(int i = 1;i <= n;i++)cin>>num[i];
		
		cout<<"Sums of "<<t<<":"<<endl;
		DFS(1,1,0);
		
		if(flag == 0)cout<<"NONE"<<endl;
	}
	return 0;
}

刷了两天DFS我还是云里雾里的…

你可能感兴趣的:(搜索,dfs,剪枝)