洛谷OJ P1036 选数(深搜DFS)

题目链接: ~传送门~

代码:

#include <iostream>
#include <math.h>
using namespace std;
int vis[25];
int a[25];
int ans;
int n,k;
bool isPrime(int n){//判断是否素数
    int s=sqrt(double(n));
    for(int i=2;i<=s;i++)
    {
        if(n%i==0)
        	return false;
    }
    return true;
}
void dfs(int m,int sum,int start)
{//m代表当前选择了几个数
	if(m==k)
	{
		if(isPrime(sum))//符合要求
			ans++;//答案加一
		return ;
	}
	for(int i=start;i<n;i++)
	{
		if(vis[i])//已经被选过
			continue;
		vis[i]=1;//标记已经选过
		dfs(m+1,sum+a[i],i+1);//强大的递归
		vis[i]=0;//恢复标记
	}
	return ;
}
int main()
{
	cin>>n>>k;
	for(int i=0;i<n;i++)
		cin>>a[i];
	dfs(0,0,0);
	cout<<ans;
	return 0;
}

发布了67 篇原创文章 · 获赞 42 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_26235879/article/details/100008561