题解 | #数组分组#
数组分组
https://www.nowcoder.com/practice/9af744a3517440508dbeb297020aca86
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNextInt()) { int size = scanner.nextInt();// 存储数量 ArrayList<Integer> arrForRest = new ArrayList<>(); // 存储既非3,又非5的倍数 int sumFor5 = 0,sumFor3 = 0; for (int i = 0; i < size ; i++) { int curNum= scanner.nextInt(); if (curNum%5 == 0) { sumFor5 = sumFor5 + curNum; // 把5的倍数加在一起的和 }else if (curNum%3 == 0 && curNum%5 != 0) { sumFor3 = sumFor3 + curNum; // 把3的倍数但不是5的倍数加在一起的和 } else { arrForRest.add(curNum); // 既非3,又非5的倍数,单独存放进arrForRest数组。该数组元素可能加在sumFor5,也可能加在sumFor3。递归树左右两分支,递归处理。 } } LinkedList<Boolean> list = new LinkedList(); // 用于存放递归树叶子到达叶子节点时,比较sumFor5 == sumFor5,如果是,记录true 1次 backTrace(arrForRest,sumFor3,sumFor5,0,list); if (list.size() == 0) { // 无一个解 System.out.println(false); } else { System.out.println(true); } } } private static void backTrace(ArrayList<Integer> arrForRest,int sumFor3,int sumFor5,int index,LinkedList list) { if (index >= arrForRest.size()) { // 索引越过arrForRest尾部,说明递归到底 if (sumFor3 == sumFor5) { list.add(true); // 递归到底,且两和相等,说明存在一个解,记录1次 } return; } backTrace(arrForRest,sumFor3 + arrForRest.get(index),sumFor5,index+1,list);// 元素加在3的倍数但不是5的倍数 分支中 backTrace(arrForRest,sumFor3,sumFor5 + arrForRest.get(index),index+1,list);// 元素加在5的倍数 分支中 } }