首页 > 试题广场 >

风电场风机发电调度问题

[编程题]风电场风机发电调度问题
  • 热度指数:1070 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
某风电场每台风机的发电量和距离升压站的距离各不相同,如风机1:发电量30,距离20;风机2:发电量35,距离25;风机3:发电量25,距离18……,要求在输电总距离限定(如小于100)的前提下,选择风机向升压站输电,使得输送的电量最大。

输入描述:
风机离升压站的距离,如 30 20 35 40

风机发电量,如 20 18 25 30

输电总距离的限制,如50


输出描述:
输送电量的最大值
示例1

输入

30 20 35 40
20 18 25 30
50

输出

38

说明

距离,发电量,总距离各起一行,数组间以空格分隔
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

    /**
     * 链接:https://www.nowcoder.com/questionTerminal/dee7a45562324d9a8e2bc7f0e4465bfc
     * [编程题]风电场风机发电调度问题
     * <p>
     * 某风电场每台风机的发电量和距离升压站的距离各不相同,
     * <p>
     * 如风机1:发电量30,距离20;风机2:发电量35,距离25;风机3:发电量25,距离18……,
     * <p>
     * 要求在输电总距离限定(如小于100)的前提下,选择风机向升压站输电,使得输送的电量最大。
     */
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        List<List<Integer>> data = new ArrayList<>();
        while (input.hasNextLine()) {
            String line = input.nextLine();
            String[] values = line.split(" ");
            List<Integer> lineData = new ArrayList<>();
            for (String value : values) {
                lineData.add(Integer.valueOf(value));
            }
            data.add(lineData);
        }

        List<Integer> distances = data.get(0);
        List<Integer> powers = data.get(1);
        int maxDist = data.get(2).get(0);
        Main s = new Main();
        System.out.println(s.getMaxResult(distances, powers, maxDist));
    }

    private int getMaxResult(List<Integer> distances, List<Integer> powers, int maxDist) {
        if (distances.size() == 0 || maxDist == 0) return 0;
        int[][] dp = new int[distances.size()][maxDist + 1];

        for (int i = 0; i < dp.length; i++) {
            int dist = distances.get(i);
            int power = powers.get(i);
            for (int j = 0; j <= maxDist; j++) {
                if (dist <= j) {
                    if (i == 0) {
                        dp[i][j] = power;
                    } else {
                        dp[i][j] = Integer.max(dp[i - 1][j - dist] + power, dp[i - 1][j]);
                    }
                } else {
                    if (i > 0) {
                        dp[i][j] = dp[i - 1][j];
                    }
                }
            }

        }
        return dp[dp.length - 1][maxDist];
    }


}

发表于 2021-03-11 16:49:27 回复(0)