
题意是从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;
}
}
}
664

被折叠的 条评论
为什么被折叠?



