- 首先来看题干,由于
懒得写 篇幅原因,题干在这里神秘的传送门 - 这道题是很明显的暴力
我不会最优解 - 大体思路如下:
1.看数据,20以内,明显搜索
2.从前往后,每一个数都只有两个状态,加入到组合中或者不加
3.判断素数时可以用sqrt()函数来优化
4.码递归代码 - 注意
1.题干中问的是组合方式,所以同一个数可能有多种组合
2.组合的结果可能是1,所以在判断素数的时候要特判1 - 最后上代码 100分
#include<bits/stdc++.h>
using namespace std;
int n,k,a[101],b[101],sum,ans;
inline void pd(){
if(sum==1) return;
for(int i=2;i<=sqrt(sum);i++)
if(sum%i==0) return;
ans++;
return;
}
inline void jqsh(int x,int y,int z){
x++;
if(y==k){
sum=z;
pd();
return;
}
if(x>n) return;
jqsh(x,y+1,z+a[x]);
jqsh(x,y,z);
return;
}
int main(){
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
jqsh(0,0,0);
printf("%d\n",ans);
return 0;
}