问(玄关

学术版

HX_ztx @ 2024-11-28 11:53:48

题目,是的,只是一个橙的搜索。。。

哪错了啊啊啊啊

#include<bits/stdc++.h>
using namespace std;
const int N=100+10;
int n,k,a[N],ans=0;
bool ss(int x){
    if(x<2)return 0;
    for(int i=2;i*i<=x;i++){
        if(!x%i)return 0;
    }
    return 1;
}
void dfs(int x,int y,int w){//现在位置,已选,和 
    if(x>n)return ;
    if(y==k){
        if(ss(w))ans++;
        return ;
    }
//  if(n-x+1+y<k)return; 
    dfs(x+1,y+1,w+a[x]);
    dfs(x+1,y,w);
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    dfs(0,0,0);
    cout<<ans;
    return 0;
}

by HX_ztx @ 2024-11-28 11:54:35

能做到全搜到啊


by csb0118 @ 2024-11-28 12:01:30

@HX_ztx 你样例都没过啊。


by HX_ztx @ 2024-11-28 12:02:04

@csb0118对啊,但是感觉写的没问题啊


by csb0118 @ 2024-11-28 12:03:40

注意到ss函数中“if(!x%i)”里,!的优先级是大于%的


by Tis员工 @ 2024-11-28 12:04:37

@HX_ztx

你的dfs(x,y,w)

是不是要表示到第 x 个数,在这之前已经选了 y 个数,选的数加起来为 w

所以你不应该从dfs(0,0,0)开始,而是要从dfs(1,0,0)

另外,把dfsif(x>n)if(y==k) 的这两个片段对调一下。x>n表示搜索完毕,但是如果同时y=k的话也是符合条件的。

改完就ac了


by Tis员工 @ 2024-11-28 12:07:00

@HX_ztx对哦另外优先级要改一下。其实每个算式都加一个括号也不会死还不会错(


by csb0118 @ 2024-11-28 12:07:39

“x%i”要加个括号,否则只要 !x成立就会返回。


by HX_ztx @ 2024-11-28 12:14:34

@csb0118@Tis员工谢谢谢谢,已经关了,谢谢了


|