天天看点

蓝桥杯 Java试题 D: 分配口罩

Java试题 D: 分配口罩

问题描述

某市市长获得了若干批口罩,每一批口罩的数目如下:(如果你把以下文字复制到文本文件中,请务必检查复制的内容是否与文档中的一致。在试题目录下有一个文件 mask.txt,内容与下面的文本相同)

9090400

8499400

5926800

8547000

4958200

4422600

5751200

4175600

6309600

5865200

6604400

4635000

10663400

8087200

4554000

现在市长要把口罩分配给市内的 2 所医院。由于物流限制,每一批口罩只能全部分配给其中一家医院。市长希望 2 所医院获得的口罩总数之差越小越好。请你计算这个差最小是多少?

答案提交

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

import java.util.Scanner;
public class Main { // 2400
  static int sum = 0;
  static int[] dp = new int[98090000];
  static int[] nums = { 0, 9090400, 8499400, 5926800, 8547000, 4958200, 4422600,
      5751200, 4175600, 6309600, 5865200, 6604400, 4635000, 10663400, 8087200, 4554000 };
  public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    for (int i = 1; i < nums.length; i++)
      sum += nums[i];
    int v = sum / 2;
    for (int i = 1; i < nums.length; i++) {
      for (int j = v; j >= nums[i]; j--) {
        dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
      }
    }
    System.out.println(dp[v]);
    System.out.println(sum - 2 * dp[v]);
  }
}      
public class Main {
    public static long res=Long.MAX_VALUE;
    public static long num[]={9090400, 8499400, 5926800, 8547000, 4958200,
                              4422600, 5751200, 4175600, 6309600, 5865200, 
                              6604400, 4635000, 10663400, 8087200, 4554000
                            }; 
    public static void main(String[] args){
        dfs(0, 0, 0);
        System.out.println(res);
    }
    public static void dfs(int k,long sum1,long sum2 ) {
        if(k==15) {
            res=res<Math.abs(sum1-sum2)?res:Math.abs(sum1-sum2);
            return;
        }
        dfs(k+1, sum1+num[k], sum2);
        dfs(k+1, sum1, sum2+num[k]);
    }
}      

2400

​谢谢大家的支持,您的一键三连是 罡罡同学前进的最大动力!​