和自己思路不同,所以发一下
查看原帖
和自己思路不同,所以发一下
1185000
darkmonster楼主2023/11/26 13:53
#include<stdio.h>
#include<math.h>
int v[25];
int ans=0;
int a,b;
int judge(int n);
void dfs(int step,int sum,int num);
int main(void){
    scanf("%d%d",&a,&b);
    for(int i=1;i<=a;i++){
        scanf("%d",&v[i]);
    }
    dfs(1,0,0);
    printf("%d",ans);
    return 0;
}
int judge(int n){
    if(n==1){
        return 0;
    }
    if(n==2||n==3){
        return 1;
    }
    if(n%6!=1&&n%6!=5){
        return 0;
    }else{
        for(int i=2;i<=sqrt(n);i++){
            if(n%i==0){
                return 0;
            }
        }
        return 1;
    }
}
//每个数只有选与不选,因此只要以此递归,
void dfs(int step,int sum,int num){
    //step判断了几个数
    //sun目前的和
    //num已经选了几个数
    if(num==b){//已经选了三个数,判断返回
        if(judge(sum)){
            ans++;
        }
        return;
    }
    if(step==a+1){//已经是最后一个数,直接返回
        return;
    }
    dfs(step+1,sum+v[step],num+1);//选了下标为step的数
    dfs(step+1,sum,num);//没有选下标为step的数
}

这是我之前做的一道题的思路,这里也适用,如果可以改进,希望大家指出(我只是刚玩洛谷几天的蒟蒻)

2023/11/26 13:53
加载中...