算法渣渣,不会递归、动态规划,突然发现与称砝码那道题思路一样
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
boolean b = test(arr);
System.out.println(b);
}
}
public static boolean test(int[] arr) {
ArrayList<Integer> list = new ArrayList<>();//存放除了5的倍数和3的倍数之外的数
int sum1 = 0;//5的倍数总和
int sum2 = 0;//3的倍数总和(不包括5的倍数)
int sum = 0;
for (int j : arr) {
sum += j;
if (j % 5 == 0) {
sum1 += j;
} else if (j % 3 == 0) {
sum2 += j;
} else {
list.add(j);
}
}
if (sum % 2 != 0) { //总和为奇数,不能分组
return false;
} else {
int mid = sum / 2;
//在list集合中找出任意个数相加的结果,保存到set集合中(去重)
//类似于称砝码那道题
HashSet<Integer> hashSet = new HashSet<>();
hashSet.add(0);
for (Integer value : list) {
ArrayList<Integer> temp = new ArrayList<>(hashSet); //保存上一次累加的结果
for (Integer integer : temp) {
hashSet.add(integer + value);
}
}
//如果有一个数与sum1(或sum2)相加等于总和一半,即可以分组
for (Integer integer : hashSet) {
if (integer + sum1 == mid) {
return true;
}
}
return false;
}
}
}