题目描述:
小蓝正在一个瓜摊上买瓜。瓜摊上共有 n 个瓜,每个瓜的重量为 Ai 。
小蓝刀功了得,他可以把任何瓜劈成完全等重的两份,不过每个瓜只能劈一刀。
小蓝希望买到的瓜的重量的和恰好为 m 。
请问小蓝至少要劈多少个瓜才能买到重量恰好为 m 的瓜。如果无论怎样小蓝都无法得到总重恰好为 m 的瓜,请输出 −1 。
代码:
package lanqiao;
import java.math.BigInteger;
import java.util.*;
public class Main {
static int n,m,nums[],min = 100;
static long sums[];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
nums = new int[n];
for(int i = 0;i < n;i ++)
{
nums[i] = sc.nextInt();
}
sums = new long[n + 1];
for(int i = n - 1;i >= 0;i --)
{
sums[i] = sums[i + 1] + nums[i];
}
dfs(0,0,0);
if(min == 100)
{
System.out.println(-1);
}else{
System.out.println(min);
}
}
public static void dfs(int i, double weight, int c) {
if (weight + sums[i] < m) {
return;
}
if (weight > m) {
return;
}
if (c >= min) {
return;
}
if (weight == m) {
min = c;
}
for (int j = i; j < n; j++) {
weight += nums[j];
dfs(j + 1, weight, c);
weight -= nums[j] / 2.0;
dfs(j + 1, weight, c + 1);
weight -= nums[j] / 2.0;
}
}
}