Java 洛谷P1036 选数

63 篇文章 1 订阅
这篇博客介绍了一个用Java编写的程序,该程序从输入数组中通过深度优先搜索找到长度为k的子序列,这些子序列的和是质数。程序包含了`isPrime`函数来判断一个数是否为质数,并通过递归的`dfs`方法遍历所有可能的子序列。博主展示了如何在给定约束下进行数值计算和优化算法设计。
摘要由CSDN通过智能技术生成

题目地址
解析可以看另一篇题解
PERKET
下面上AC代码

import java.util.*;
import java.math.*;
public class Main {
    public static List<Integer> list=new ArrayList<Integer>();
    public static int res=0;
    public static void main(String[] args){
    	Scanner sc=new Scanner(System.in);
    	int n=sc.nextInt();
    	int k=sc.nextInt();
    	int[] nums=new int[n];
    	for(int i=0;i<n;i++)
    		nums[i]=sc.nextInt();
    	dfs(nums,0,k);
    	System.out.println(res);
    }
    public static void dfs(int[] nums,int n,int k){
    	int len=nums.length;
    	if(list.size()==k){
    		int cur=0;
    		for(Integer i:list)
    			cur+=i;
    		if(isPrime(cur)==1)
    			res++;
    		return;
    	}
    	if(list.size()+len-n+1<k||n==len)
    		return;
    	list.add(nums[n]);
    	dfs(nums,n+1,k);
    	list.remove(new Integer(nums[n]));
    	dfs(nums,n+1,k);
    	
    }
    public static int isPrime(int n){
    	if(n==1)
    		return 0;
    	if(n==2||n==3)
    		return 1;
    	if(n%6!=1&&n%6!=5)
    		return 0;
    	for(int i=5;i<=Math.sqrt(n);i+=6){
    		if(n%i==0||n%(i+2)==0)
    			return 0;
    	}
    	return 1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小崔崔谁用的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值