华为OD (E卷,200分)-查找充电设备组合(Java)

题目描述

某个充电站,可提供 n 个充电设备,每个充电设备均有对应的输出功率。

任意个充电设备组合的输出功率总和,均构成功率集合 P 的 1 个元素。

功率集合 P 的最优元素,表示最接近充电站最大输出功率 p_max 的元素。

输入描述

输入为 3 行:

  • 第 1 行为充电设备个数 n
  • 第 2 行为每个充电设备的输出功率
  • 第 3 行为充电站最大输出功率 p_max

备注

  • 充电设备个数 n > 0
  • 最优元素必须小于或等于充电站最大输出功率 p_max

输出描述

功率集合 P 的最优元素

示例1

输入

4
50 20 20 60
90

输出

90

    说明

    当充电设备输出功率50、20、20组合时,其输出功率总和为90,最接近充电站最大充电输出功率,因此最优元素为90。

    示例2

    输入

    2
    50 40
    30
    

    输出

    0
    

      说明

      所有充电设备的输出功率组合,均大于充电站最大充电输出功率30,此时最优元素值为0。

      示例3

      输入

      3
      2 3 10
      9
      

      输出

      5
      

        说明

        选择功率为2,3的设备构成功率集合,总功率为5,最接近最大功率9。不能选择设备10,因为已经超过了最大功率9。

        示例3

        输入

        3
        1 2 3
        5
        

        输出

        5
        

          说明

           

          题解

          官方题解不够简洁,其实这就是一个基础的01背包问题,组合不能超过最大输出功率这就能将充电设备功率看做重量,选出最接近最大功率的组合值就能将充电功率也看做价值,即重量和价值是完全相等的01背包问题

          import java.util.Scanner;
          
          public class 查找充电设备组合 {
              public static void main(String[] args) {
                  Scanner sc = new Scanner(System.in);
                  int n = sc.nextInt();
                  int[] charges = new int[n];
                  for (int i = 0; i < n; i++) {
                      charges[i] = sc.nextInt();
                  }
                  int target = sc.nextInt();
                  //0-1背包问题,可以看做重量和价值(充电设备功率)相等,背包容量就是充电站最大输出功率
                  int[] dp = new int[target+1];
                  for (int i = 0 ; i < n ; i ++){
                      int w = charges[i];
                      for (int j = target ; j >= w ; j --){
                          dp[j] = Math.max(dp[j] , dp[j-w] + w);
                      }
                  }
          
                  System.out.println(dp[target]);
          
              }
          }

          可以通过此链接熟悉各种背包 DP - OI Wiki问题

          评论
          添加红包

          请填写红包祝福语或标题

          红包个数最小为10个

          红包金额最低5元

          当前余额3.43前往充值 >
          需支付:10.00
          成就一亿技术人!
          领取后你会自动成为博主和红包主的粉丝 规则
          hope_wisdom
          发出的红包
          实付
          使用余额支付
          点击重新获取
          扫码支付
          钱包余额 0

          抵扣说明:

          1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
          2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

          余额充值