-
题目描述
-
输入格式
-
输出格式
-
基本思路
-
一次选一个数,注意按照升序来选(因为是组合不是排列,避免最终选出的数集重复),采用递归的方式,每选完一个数在调用自身选下一个数,直到递归出口(全部选完)
-
程序清单
#include<stdio.h>
#include<math.h>
#include<stdbool.h>
int a[20+5]; //数组下标代表数在数组中的位置
int amt;
int n,k,js=0;
bool isprime(int x);
void sort(int w,int m); //从上一个数(第w-1个数,位置在m处)开始往后选出下一个数(第w个数)并加入总和,保证不重样
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++) //输入第0到第n-1共n个数(位置即0到n-1)
{
scanf("%d",&a[i]);
}
sort(1,-1); //开始选第一个数,缺省第一个数的上一个数位置为-1
printf("%d",js);
return 0;
}
bool isprime(int x) //判断素数
{
for(int i=2;i<(int)(sqrt(x))+1;i++)
if(x%i==0&&x!=2) return false;
return true;
}
void sort(int w,int m)//从上一个数(第w-1个数)的位置m开始选出下一个数(第w个数)并加入总和,保证不重样
{
if(w-1==k) //判断上一步执行后是否全部选完了
{
if(isprime(amt)) js++;
return;
} //全部选出的情况下,如果和为素数则计数加一,否则返回上一步
else //直到上一步还没选完,接着选
{
for(int i=m+1;i<=n-1;i++) //从上一个数(位置m)的下一位(位置m+1)开始选,不行就换下下位,依此类推
{
amt+=a[i]; //将这次选出来的数计入总和
sort(w+1,i); //选下一个数
amt-=a[i]; //每次选完后面的数之后,退回这次选的数
}
}
return;
}