• 蓝桥杯2023年第十四届省赛真题-买瓜--Java题解


    目录

    蓝桥杯2023年第十四届省赛真题-买瓜

    题目描述

    输入格式

    输出格式

    样例输入

    样例输出

    提示

    【思路解析】

    【代码实现】


    蓝桥杯2023年第十四届省赛真题-买瓜

    时间限制: 3s 内存限制: 320MB 提交: 796 解决: 69

    题目描述

    小蓝正在一个瓜摊上买瓜。瓜摊上共有 n 个瓜,每个瓜的重量为 Ai 。

    小蓝刀功了得,他可以把任何瓜劈成完全等重的两份,不过每个瓜只能劈一刀。

    小蓝希望买到的瓜的重量的和恰好为 m 。

    请问小蓝至少要劈多少个瓜才能买到重量恰好为 m 的瓜。如果无论怎样小蓝都无法得到总重恰好为 m 的瓜,请输出 −1 。

    输入格式

    输入的第一行包含两个整数 n, m,用一个空格分隔,分别表示瓜的个数和小蓝想买到的瓜的总重量。

    第二行包含 n 个整数 Ai,相邻整数之间使用一个空格分隔,分别表示每个瓜的重量。

    输出格式

    输出一行包含一个整数表示答案。

    样例输入

    复制

    3 10
    1 3 13

    样例输出

    复制

    2

    提示

    对于 20% 的评测用例,∑n≤10;

    对于 60% 的评测用例,∑n≤20;

    对于所有评测用例,1 ≤n≤30,1≤ Ai ≤ 109 ,1 ≤ m ≤ 10^9

    【思路解析】

    这道题是一个很简单的递归可能性的罗列,但是每次递归有三个情况,则时间复杂度为O(3^N),时间复杂度过高,所以需要在递归过程中除掉那些完全不可能的解,使复杂度降低。

    【代码实现】

    1. package LQB;
    2. import java.util.Scanner;
    3. /**
    4. * @ProjectName: study3
    5. * @FileName: Ex4
    6. * @author:HWJ
    7. * @Data: 2023/9/17 21:54
    8. */
    9. public class Ex4 {
    10. static double[] subs; // subs[i]表示为西瓜i -西瓜n-1的西瓜质量和,用于对递归的降低可能性
    11. static double m;
    12. static int n;
    13. static int min = 40; // 因为n最大为30,所以最多劈瓜30
    14. static double[] weights; // weights[i]表示为第i个西瓜的质量
    15. public static void main(String[] args) {
    16. Scanner input = new Scanner(System.in);
    17. n = input.nextInt();
    18. m = input.nextInt();
    19. weights = new double[n];
    20. subs = new double[n];
    21. for (int i = 0; i < n; i++) {
    22. weights[i] = input.nextInt();
    23. }
    24. subs[n - 1] = weights[n - 1];
    25. for (int i = n - 2; i >= 0; i--) {
    26. subs[i] = subs[i + 1] + weights[i];
    27. }
    28. int p = dfs(0, 0, 0);
    29. System.out.println(p == Integer.MAX_VALUE ? -1 : p);
    30. }
    31. // sum 表示现在搞定了多少西瓜 index 表示现在对第几个西瓜做决策 have表示现在已经劈了几次瓜了
    32. public static int dfs(double sum, int index, int have) {
    33. if (have >= min) { // 如果此时虽然满足要求但他大于了当前的最优情况,他不可能是最优解,直接排除掉
    34. return Integer.MAX_VALUE;
    35. }
    36. if (sum == m) { // 达到满足要求
    37. min = have; // 更新最小情况。
    38. return have;
    39. }
    40. if (sum > m) {
    41. return Integer.MAX_VALUE; // 此时不加任何西瓜 重量也已经超过了需要的重量,所以直接排除
    42. }
    43. if (index == n) {
    44. return Integer.MAX_VALUE; //此时已经使用了所有西瓜,也无法满足,直接排除掉
    45. }
    46. if (subs[index] + sum < m) {
    47. return Integer.MAX_VALUE; // 此时加上后面所有的西瓜也不满足条件,所以没有必要再递归了,
    48. }
    49. int p1 = dfs(sum + weights[index], index + 1, have);
    50. int p2 = dfs(sum + weights[index] / 2.0, index + 1, have + 1);
    51. int p3 = dfs(sum, index + 1, have);
    52. return Math.min(p1, Math.min(p2, p3));
    53. }
    54. }

  • 相关阅读:
    Jenkins继续集成2
    Windows下用msys2 编译gmp遇到的问题
    Vue3中的常见组件通信之v-model
    嵌入式面试:大疆 2023 春招
    低代码开发技术选型
    Dubbo之多协议、多注册中心、多版本。
    java EE初阶 — 如何进行多线程编程
    PHP基础教程——总结W3school
    28岁功能测试被辞,最后结局令人感慨...
    springcloud引入Eureka报错
  • 原文地址:https://blog.csdn.net/weixin_73936404/article/details/132956767