在一个包含n个元素的数组中,选取和为质数的k个元素(k<n),有多少选法
#include <iostream>
using namespace std;
int num[21];
bool IsPrime(int a)
{
if(a<2)return false;
for(int i=2;(i*i)<=a;++i)
if(a%i==0)return false;
return true;
}
//remain-剩下选数的个数-用来确定递归的出口/循环的边界
//sum-已选数值之和;count-选数之和为质数的个数
//ori-剩下选数子数组起点,end-子数组终点
int Combine(int remain,int sum,int ori,int end)
{
if(remain==0)
return IsPrime(sum);
/* 目标是“和为质数”的个数,如果要求输出相应的质数和,如何修改
if(IsPrime(sum))return ans[++count]=sum;*/
int count=0;
for(int i=ori;i<=end;i++)
// count+=Combine(remain-1,sum+num[i],ori+1,end);
//致命错误!!!是临时起点i+1!!! 不是ori+1!!!!
count+=Combine(remain-1,sum+num[i],i+1,end);
return count;
}
int main()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;++i)
cin>>num[i];
cout<<Combine(k,0,1,n)<<endl;
return 0;
}