- 题目描述
- 输入格式
- 输出格式
基本思路
- 一次选一个数,注意按照升序来选(因为是组合不是排列,避免最终选出的数集重复),采用递归的方式,每选完一个数在调用自身选下一个数,直到递归出口(全部选完)
程序清单
#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; }
来源:https://www.cnblogs.com/BAIDI-HOME/p/12298175.html