华为OD机试-MELON的难题-DFS(JAVA 2025A卷)
题意是从N快雨花石中找出最少拿出雨花石的块数,使得雨花石可以均分,直接使用dfs解决此类组合问题
package com.example.demo.bean;import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;public class YuHuaStone {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = Integer.parseInt(sc.nextLine());int[] nums = new int[n];for (int i = 0; i < n; i++) {nums[i] = sc.nextInt();}System.out.println(yuHuaStone(nums));}private static int res = Integer.MAX_VALUE;private static int yuHuaStone(int[] nums) {int sum = Arrays.stream(nums).sum();if (sum % 2 != 0) return -1;int[] used = new int[nums.length];LinkedList<Integer> path = new LinkedList<>();Arrays.sort(nums);dfs(nums, nums.length - 1, path, used, sum / 2);return res == Integer.MAX_VALUE ? -1 : res;}private static void dfs(int[] nums, int start, LinkedList<Integer> path, int[] used, int target) {if (target == 0) {res = Math.min(res, path.size());return;}for (int i = start; i >= 0; i--) {// 雨花石累加和>target,或者累加的雨花石数目>已算出的最小雨花石数目,剪枝if (target <= 0 || path.size() >= res) break;// 同一层内,重复重量的雨花石直接剪枝if (i < nums.length - 1 && nums[i + 1] == nums[i] && used[i + 1] == 0) continue;path.addLast(nums[i]);used[i] = 1;dfs(nums, i - 1, path, used, target - nums[i]);path.removeLast();used[i] = 0;}}
}