二次求调站外题
  • 板块学术版
  • 楼主TheSpectre_
  • 当前回复37
  • 已保存回复37
  • 发布时间2022/11/16 12:40
  • 上次更新2023/10/27 02:48:11
查看原帖
二次求调站外题
635261
TheSpectre_楼主2022/11/16 12:40

(之前问过一次,有大佬提供了重构代码与思路,但蒟蒻还想着要自己做,于是就有了这个帖)

(注释较多,请谅解:)


题目描述

已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:3+7+12=22  3+7+19=29  7+12+19=38  3+12+19=34。

现在,要求你计算出和为素数共有多少种。 例如上例,只有一种的和为素数:3+7+19=29)。

代码如下:

#include<bits/stdc++.h>
#include<cmath>
using namespace std;
int a[100],b[100],n,k,an,as,c[100];
int ss(int a){
    int b;
    int c;
    for(int i = 2;i < a;++i){
        b = a%i;
        if(b != 0){
            if(i == ceil(sqrt(a))){
                c = 1;
                return c;
            }
        }
        if(b == 0){
            c = 0;
            return c;
        }

    }

}
/*int sz(int x,int s){
    for(int i=0;i<=s;i++){
        if(x==c[i]){
            return 1;
        }
    }
}*/
int sousuo(int sn){
    //cout<<n<<endl;
    for(int i=1;i<=k;i++){
        if(!b[i]){
            as=as+a[sn];
            b[i]=1;
            if(i==k){
                if(ss(as)==1){
                    an++;
                    //c[i]=as;
                    //cout<<as<<endl;
                }
            }

            else    sousuo(sn+1);
            b[i]=0;
            as=as-a[sn];
        }
    }
}
int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        //cout<<a[i]<<" ";
    }
    sousuo(1);
    cout<<an;
}
2022/11/16 12:40
加载中...