1.题目描述
已知 n 个整数 x1,x2,⋯,xn,以及 1 个整数 k(k<n)。从 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
1.1.输入格式
第一行两个空格隔开的整数 n,k(1≤n≤20,k<n)。
第二行 n 个整数,分别为x1,x2,⋯,xn(1≤x[i]≤5×106)。
样例输入
4 3 3
7 12 19
1.2.输出格式
输出一个整数,表示种类数。
样例输出
1
2.代码
2.1.判断素数
int zhi(int b)
{
int i;
for(i=2;i*i<=b;i++)
{
if(b%i==0)如果整除
{
return 0;
}
}
//程序到这里就说明此为素数
return 1;
}
2.2.最重要的递归部分
void dfs(int w)
{
int i;
if(w>k)
{
int sum=0;
for(i=1;i<=n;i++) sum+=x[a[i]];//相加
if(zhi(sum))
{
s++;//和是一个素数,计数
}
return;//返回
}
for(i=a[w-1]+1;i<=n;i++)
{
a[w]=i;
dfs(w+1);//因为不会重复,直接递归到下一层
}
}
2.3. main函数
int main()
{
int i;
cin>>n>>k;//输入
for(i=1;i<=n;i++)
{
cin>>x[i];
}//输入
dfs(1);//递归下一层
cout<<s;//输出计数
return 0;
}
3.完整代码
#include<iostream>
#include<cstdio>
using namespace std;
int n,k,x[25],t,a[25],s;
int zhi(int b)
{
int i;
for(i=2;i*i<=b;i++)
{
if(b%i==0)
{
return 0;
}
}
return 1;
}
void dfs(int w)
{
int i;
if(w>k)
{
int sum=0;
for(i=1;i<=n;i++) sum+=x[a[i]];
if(zhi(sum))
{
s++;
}
return;
}
for(i=a[w-1]+1;i<=n;i++)
{
a[w]=i;
dfs(w+1);
}
}
int main()
{
int i;
cin>>n>>k;
for(i=1;i<=n;i++)
{
cin>>x[i];
}
dfs(1);
cout<<s;
return 0;
}