问题标题: 酷町堂:5013 和为素数

0
0
已解决
李显晨
李显晨
中级启示者
中级启示者

传送门

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n,cnt,ans[24000000],k,a[24000000];
bool vis[24000000];
bool zs(int n){
    if(n==1) return 0;
    for(int i=2;i<=sqrt(n);i++){
        if(n%i==0) return 0;
    }
    return 1;
}
bool pd(int x){
    int sum=0;
    for(int i=1;i<x;i++) sum+=ans[i];
    if(zs(sum)) return 1;
    return 0;
}
void dfs(int x){
    if(x>k){
        if(pd(x)) cnt++;
        return;
    }
    for(int i=1;i<=n;i++){
        if(!vis[a[i]]){
            ans[x]=a[i];
            vis[a[i]]=1;
            dfs(x+1);
            vis[a[i]]=0;
        }
    }
}
int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>a[i];
	dfs(1);
    cout<<cnt;
	return 0;
}

样例不对啊!求大佬找错

李显晨在2021-10-09 17:39:08追加了内容
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n,cnt,ans[24000000],k,a[24000000];
bool vis[24000000];
bool zs(int n){
    if(n==1) return 0;
    for(int i=2;i<=sqrt(n);i++){
        if(n%i==0) return 0;
    }
    return 1;
}
bool pd(int x){
    int sum=0;
    for(int i=1;i<x;i++) sum+=ans[i];
    if(zs(sum)) return 1;
    return 0;
}
void dfs(int x,int pos){
    if(x>k){
        if(pd(x)) cnt++;
        return;
    }
    for(int i=pos+1;i<=n;i++){
        ans[x]=a[i];
        dfs(x+1,pos+1);
    }
}
int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>a[i];
	dfs(1,0);
    cout<<cnt;
	return 0;
}

不对啊!@曹博扬


1
已采纳
汪恺恒
汪恺恒
中级启示者
中级启示者

注意去重

比如你算了个3+7+19是个素数,下次有会算出7+3+9是个素数。

所以每次搜索是应该加个参数表示上次选的数的位置,这样就不会重复了,不需要vis数组

 

1
曹博扬
曹博扬
初级天翼
初级天翼

同意楼上,加一个参数pos每次循环从pos+1开始

其他都是没问题的

pos从0开始,因为每次都从pos+1开始循环

曹博扬在2021-10-09 21:28:10追加了内容

嗯,我找到问题了,你每次pos要=i而不是i+1

我要回答