re,求助大佬

P1036 [NOIP2002 普及组] 选数

```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


|