P1036 选数
P1036 选数
题解
1.这道题是用递归做(貌似是DFS搜索与回溯,好像没有本质区别)
dg ( last , now ) 已经选了last个数,现在要选第now个数
为了保证不重复,要选第now个数那就从编号now~n当中选数喽
2.判断结果是不是素数
不能用线性筛,范围太大太浪费(我用xxs WA了)
要用试除法,1~√n
代码
#include<bits/stdc++.h> using namespace std; int k,n,ans=0; int a[21],v[21]; int sum=0; int scf(int shu) //要用试除法,不能用线性筛 { for(int i=2;i<=sqrt(shu);i++) if(shu%i==0) return 0; return 1; } void dg(int last,int now) //已经选了last个数字,现在要选第now个数 { for(int i=now;i<=n;i++) { v[i]=1; sum+=a[i]; if(last+1==k) //找全一组数据 { if(scf(sum)) ans++; } else //没找够,继续找 dg(last+1,i+1); sum-=a[i]; //回溯 v[i]=0; } } int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%d",&a[i]); dg(0,1); printf("%d",ans); }