cometoj——[欢乐赛]第002话 宝可梦中心大对决!

题目描述

在大木博士那里,小智发现推荐的三只宝可梦都已经被別人選走了,最终他挑选了皮卡丘作为自己的第一只宝可梦。皮卡丘不是很待见小智,但还是在危急之时救了小智一命,小智和皮卡丘的关系也因此熟络了许多。皮卡丘因为救小智受了重伤,小智急忙带着皮卡丘去常磐市的医院治疗。

常磐市经常发生绑架宝可梦的事件,犯人是一男一女,他们这天也来到了常磐市的治疗中心,准备劫走治疗中心里面罕见的宝可梦。用"华丽"的方式登场后,将他们的宝可梦瓦斯弹和阿柏蛇放出来,开始攻击和搜寻每一间房间,并且把电源给切断了。

小智、小霞和护士姐姐迅速把趟在病床上的皮卡丘推进传送室,停电后,护士姐姐说他们有备用电源,小智放眼一看,正在发电的居然是一群训练有素的皮卡丘!小智发现,每一个皮卡丘后背都有一个数字,护士姐姐解释说:“皮卡丘集中发电的能力跟他们后背的数字有关,当上场发电的皮卡丘们后背的数字任两个数字都互质的话,他们的发电能力就会强大无比!当然,同样都是互质的情况下,上场的皮卡丘数量越多越好。”

不管是战斗,还是发电,我们都需要皮卡丘!现在,已知共有 n 只皮卡丘,给出每只皮卡丘后背的数字,请你选择尽量多的皮卡丘上场,使得它们后背的数满足任意两个数字互质。只需输出你最多能选择了多少只皮卡丘。

注:两个数字互质当且仅当他们没有 1 以外的正公因数。

import java.util.Scanner;

public class Main {
	public static int count = 0;

	public static void main(String[] args) {
		Scanner read = new Scanner(System.in);
		int i = read.nextInt();
		for (int j = 0; j < i; j++) {
			count = 0;
			int n = read.nextInt();
			boolean t[] = new boolean[n];
			int num[] = new int[n];
			for (int m = 0; m < n; m++) {
				num[m] = read.nextInt();
			}
			f(num, num.length - 1, t);
			System.out.println(count);
		}
	}

	static void f(int num[], int length, boolean t[]) {// 每只皮卡丘只有两种选择,选与不选
		if (length < 0) {
			int i = 0;
			for (int j = 0; j < num.length; j++) {
				for (int k = 0; k < j; k++) {
					if (t[k] && t[j])
						if(prime(num[j], num[k]) != 1)
							return ;
				}
			}
			for (int k = 0; k < num.length; k++) {
				if (t[k]) {
					i++;
				}
			}
			if (i > count) {
				count = i;
			}
			return;
		}
		t[length] = false;
		f(num, length - 1, t);
		t[length] = true;
		f(num, length - 1, t);
	}

	static long prime(long a, long b) {
		if (a%b==0) 
		{
			return b;
		} else 
		{
			return prime(b, a%b);
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值