洛谷P1036选数

题目描述:
已知 n 个整数 x1,x2,…,xn,以及1个整数k(k

3+7+12=22

3+7+19=29

7+12+19=38

3+12+19=34

现在,要求你计算出和为素数共有多少种。

例如上例,只有一种的和为素数:3+7+19=29

输入样例:
4 3
3 7 12 19
输出样例:
1

#include
int a[10001];  //记录所选的数
int n, k, sum, total;  //total为总方案数
int is_prime(int x)  //素数判断
{
	for(int i = 2; i * i <= x; i++)
	{
		if(x % i == 0)
	    {
	    	return 0;
		}
	}
        return 1;
}
void dfs(int step, int sum, int cnt)
{
    if(step == n)  //如果已经进行到了n次
        {
            if(is_prime(sum) && cnt == k)  //如果sum为一个素数且已经选了k个数
            {
            	total++;  //总方案数+1
			}
            return;  //返回
        }
        dfs(step + 1, sum + a[step], cnt + 1);  //选择下一个数
        dfs(step + 1, sum, cnt);  //不选择下一个数
        return;
}
int main()
{
    scanf("%d%d", &n, &k);
    for(int i = 1; i <= n; i++)
    {
       	scanf("%d", &a[i]);
	}
    dfs(0, 0, 0);  //从第个数开始搜
    printf("%d", total);
    return 0;
}

你可能感兴趣的:(深度优先搜索)