题目描述
已知 n 个整数 x1,x2,⋯,xn,以及 个整数 k。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:
3+7+12=22
3+7+19=29
7+12+19=38
3+12+19=34
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:3+7+19=29。
输入格式
第一行两个空格隔开的整数 n,k
第二行 n 个整数,分别为x1,x2,⋯,xn(
输出格式
输出一个整数,表示种类数。
题解dfs递归
#include<iostream>
using namespace std;
int a[10000]={0};
int ch[100]={0};
int num;//素数总数
int xuan=0;
int n,k;//n总数字个数,k要求筛选的个数
int su(int ni)
{
int sum=0;
for(int i=1;i<=ni;i++)
{
sum+=ch[i];
}
for(int i=2;i*i<=sum;i++)
{
if(sum%i==0)
{
return 0;
}
}
return 1;
}
void dfs(int xuan,int ceng)
{
if(ceng==k+1&&su(k))
{
num++;
return ;
}
for(int i=xuan;i<=n;i++)
{
ch[ceng]=a[i];
dfs(i+1,ceng+1);
}
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
dfs(1,1);
cout<<num;
return 0;
}
注意要点:
1.重复用数的问题:要注意区分层数与已选择的标数