金条贪心问题转换哈夫曼编码求解

题目:

一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为20的
金条,不管切成长度多大的两半,都要花费20个铜板。 -群人想整分整块金条,怎么分最省铜板?

  • 例如,给定数组{10, 20, 30},代表一共三个人,整块金条长度为10+20+30=60.
    金条要分成10, 20, 30三个部分。如果,先把长度60的金条分成10和50,花费60再把长度50的金条分成20和30,花费50-共花费110铜板。
    但是如果,.先把长度60的金条分成30和30,花费60再把长度30金条分成10和20,花费30-共花费90铜板。
    输入一个数组,返回分割的最小代价。

实现思路

这其实就是个贪心求解可利用哈夫曼编码构造解
采用优先队列的小根堆结构构造哈夫曼树
每次取出堆中最小的两个元素并相加生成新的结果 放回到堆中,直到堆中元素只有一个 就是最小代价

代码


/**
 * @description: 贪心求解(哈夫曼编码)
 * @Author MRyan
 * @Date 2020/6/12 16:11
 * @Version 1.0
 */

/**
 * 实现思路:采用优先队列的小根堆结构构造哈夫曼树
 * 每次取出堆中最小的两个元素并相加生成新的结果 放回到堆中,直到堆中元素只有一个 就是最小代价
 */
public class code_10 {

    public static final void main(String[] args) {
        int[] nums = {2,5,3,6,9};
        int answer = answer(nums);
        System.out.println(answer);
    }


    private static int answer(int[] nums) {
        int answer = 0;
        PriorityQueue<Integer> integers = new PriorityQueue<>();
        for (int i : nums) {
            integers.add(i);
        }
        while (integers.size() > 1) {
            Integer one = integers.poll();
            Integer two = integers.poll();
            integers.add(one + two);
            answer += one + two;
        }
        return answer;
    }

}


猜你喜欢

转载自blog.csdn.net/qq_35416214/article/details/106767993
今日推荐