P1036 选数
程序员文章站
2022-06-08 12:23:08
...
#include<stdio.h>
#include<cmath>
int a[25];
int sum = 0;
int count = 0;
int n;
int k;
void fun(int i, int p);
int isp(int n)
{
if (n <= 1)
return 0;
int x = sqrt(n);
for (int i = 2; i <= x; i++)
{
if (n % i == 0)
return 0;
}
return 1;
}
int main()
{
scanf("%d%d", &n, &k);
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
int i = 0;
fun(i, k);
printf("%d", count);
return 0;
}
void fun(int i, int p)
{
if (p == 0) //这时候,不需要选择了
{
if (isp(sum)) //如果sum和是素数
count++; //则加1
return; //如果没有这个,会导致stack overflow
}
for (i; i <= n - p; i++)
{
sum += a[i]; //选择一个数
fun(i + 1, p - 1); //选择其他的数
sum -= a[i]; //把选择的数删掉,为选择第二个数做准备
}
}
总结:
我TM都不知道我怎么就ac了!!
这个应该算作是深度优先搜索
先做好一个的操作,然后,就是递归调用函数,进行下一个数的操作