跳至主要內容

选数

莫传航2024年11月15日大约 1 分钟教学文档回溯与分支限界-dfs

[NOIP2002 普及组] 选数

洛谷-P1036open in new window

题目描述

已知 nn 个整数 x1,x2,,xnx_1,x_2,\cdots,x_n,以及 11 个整数 kkk<nk<n)。从 nn 个整数中任选 kk 个整数相加,可分别得到一系列的和。例如当 n=4n=4k=3k=344 个整数分别为 3,7,12,193,7,12,19 时,可得全部的组合与它们的和为:

3+7+12=223+7+12=22

3+7+19=293+7+19=29

7+12+19=387+12+19=38

3+12+19=343+12+19=34

现在,要求你计算出和为素数共有多少种。

例如上例,只有一种的和为素数:3+7+19=293+7+19=29

输入格式

第一行两个空格隔开的整数 n,kn,k1n201 \le n \le 20k<nk<n)。

第二行 nn 个整数,分别为 x1,x2,,xnx_1,x_2,\cdots,x_n1xi5×1061 \le x_i \le 5\times 10^6)。

输出格式

输出一个整数,表示种类数。

样例 #1

样例输入 #1

4 3
3 7 12 19

样例输出 #1

1

提示

【题目来源】

NOIP 2002 普及组第二题

我的代码

import java.util.*;
public class Main{
    public static int n,k,arr[],ans=0;
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        k=sc.nextInt();
        arr=new int[n+1];
        for(int i=0;i<n;i++){
            arr[i]=sc.nextInt();
        }
        dfs(0,0,0);
        System.out.println(ans);
        return;
        
    }
    public static boolean isprime(int x){
        if(x==1)return false;
        for(int i=2;i*i<=x;i++){
            if(x%i==0){
                return false;
            }
        }
        return true;
    }
    public static void dfs(int t,int m,int start){
        if(t==k){
            if(isprime(m)){
                ans++;
            }
            return;
        }
        for(int i=start;i<n;i++){
            dfs(t+1,m+arr[i],i+1);
        }
        return;
    }
}
上次编辑于: 2024/12/3 02:25:56
贡献者: molittle