题解区域关闭了,本人的第一道dfs题目,思路想发出来就放这里了
查看原帖
题解区域关闭了,本人的第一道dfs题目,思路想发出来就放这里了
406087
Uninreal_Enginety_3D楼主2020/11/5 21:31

讨论区题解

#include<bits/stdc++.h>//万能头 
using namespace std;//标准命名空间(你也可以不写这个,在语句最前面加std::) 

int n,k;//n和k看题目 
int a[23];//a为存n个可选的数的 
int ans=0;//ans为最终的答案 
bool sushu(int num){//判断素数的函数,num为要判断的数 
	for(int i=2;i<num;i++){//从2到num-1 
		if(num%i==0){//如果能整除那么说明它已经不是素数了 
			return false;//直接返回false 
		}
	}
	return true;//否则一趟下来都没有可以整除的数说明他是素数,返回true 
}
int pro=0;
void dfs(int step,int shengyudeshu){//老思路了,step就是还有几个格子没有被选,shengyudeshu就是还能选后面的几个数 
	if(step==0){//如果格子都选完了那么就说明这个算式列完了 
		if(sushu(pro)){//那么判断是不是素数 
			ans++;//如果是说明这个算式是素数,那么ans+1 
			return;//返回 
		}
	}else{//如果还可以格子还有,那么继续放数字 
		shengyudeshu++;//从下一个数字开始放(一个数只能放一次) 
		for(int i=shengyudeshu;i<=n;i++){//从第shengyudeshu开始放,放到第n个数 
			pro+=a[i];//把他们的和加起来 
			step--;//格子-1 
			dfs(step,i);//继续执行新的搜索 
			pro-=a[i];//将和清零,以便下一个算式的计算 
			step++;//格子也返回回去 
		}
	}
}
int main(){//主函数 
	cin>>n>>k;//输入n,k 
	for(int i=1;i<=n;i++){//for循环n次 
		cin>>a[i];//输入可选的n个数 
	}
	dfs(k,0);//一共有k个格子,第二个参数给0因为第一次执行的时候先shengyudeshu++;
	cout<<ans;//输出答案 
}
2020/11/5 21:31
加载中...