```cpp
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,k,sn[21],cnt1=0,cnt=0;
void pdd(int x){
for(int i=2;i<=sqrt(x);i++)
if(x%i==0)return;
cnt++;
}
void dfs(int t,int pre){
if(t==0){
pdd(cnt1);
return;
}
for(int i=pre+1;i<=n-t+1;i++) {
cnt1+=sn[i];
dfs(t-1,i);
cnt1-=sn[i];
}
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&sn[i]);
for(int i=1;i<=n-k+1;i++){
cnt1+=sn[i];
dfs(k-1,i);
cnt1-=sn[i];
}
printf("%d\n",cnt);
}
```
这是已经AC的代码。
首先你的输入输出那边就有点问题。
- for(int i=1;i<=n;i++)
- scanf("%d",sn[i]);
- printf("%d",&cnt);
但是实际上的输入输出是
- for(int i=1;i<=n;i++)
- scanf("%d",&sn[i]);
- printf("%d",cnt);
取址符的位置错了。
可能就是这里导致了你的RE
然后
```cpp
void pdd(long long x){
int f=0;
for(int i=1;i<=sqrt(x);i++)
if(!(x%i))f=1;
if(!f) cnt++;
}
```
一个小Bug(应该没什么问题的)就是你的x用Int类型就够了,因为你原本定义的变量cnt1就是int类型的,尽量不要乱了。
还有,你如果判定的时候直接从1开始,那么不是意味着所有的数都是素数吗?因为所有的正整数都可以被1整除啊。
所以可以改成这样:
```cpp
void pdd(int x){
for(int i=2;i<=sqrt(x);i++)
if(x%i==0)return;
cnt++;
}
```
简洁明了。
然后dfs的时候也不用太麻烦
```cpp
void dfs(int t,int pre){
if(t==0){
pdd(cnt1);
return;
}
for(int i=pre+1;i<=n-t+1;i++) {
cnt1+=sn[i];
dfs(t-1,i);
cnt1-=sn[i];
}
}
直接搜下一位,不需要一个Bool数组来记录,因为你回溯的时候等于有了这么一步操作。
```
by Lyrics @ 2017-12-03 21:32:11
@ flybtr123
by Lyrics @ 2017-12-03 21:32:48
@[flybtr123](/space/show?uid=61302)
by Lyrics @ 2017-12-03 21:33:02
@[Lyrics](/space/show?uid=28939) 谢谢大佬指导,成功a了
by flybtr123 @ 2017-12-05 23:17:05