赚最多的钱 --贪心算法

2022-05-13 09:40:21 浏览数 (1)

输入: 参数1,正数数组costs 参数2,正数数组profits 参数3, 正数k 参数4,正数m costs[i]表示i号项目的花费 profits[i]表示i号项目在扣除花 费之后还能挣到的钱(利润) k表示你不能并行、只能串行的最多做k个项目 m表示你初始的资金 说明:你每做完一个项目,马上获得的收益,可以支持你去做下 一个 项目。 输出: 你最后获得的最大钱数

思想 :以项目成本做一个小根堆,将小根堆里小于等于本金的项目加入以项目利润构成的大根堆,在k次以内,每次取最大利润的项目做,若达到k次或者自己成本内没有可以做的项目结束.

代码

代码语言:javascript复制
package com.algorithm.practice.heap;

import java.util.Comparator;
import java.util.PriorityQueue;

public class MakeMoreMoney {
    public class Node{
        int cost;
        int getM;
        public Node(int c,int g){
            this.cost=c;
            this.getM=g;
        }
    }
    public class minHeapCompartor implements Comparator<Node>{ //以成本打造小根堆
        @Override
        public int compare(Node n1,Node n2) {
            return n1.cost-n2.cost;
        }
    }
    public class MaxHeapCompartor implements Comparator<Node>{ //以利润打造大根堆
        @Override
        public int compare(Node n1,Node n2) {
            return n2.getM-n1.getM;
        }
    }

    public int makeMoreMoneyint (int k, int W, int[] Profits, int[] Capital){
        //k 可以做项目的次数,  W 资本,  Profits 利润,  Capital 成本
        Node[] progectS=new  Node[Profits.length];
        for(int i=0;i<progectS.length;i  ){//添加成本和利润构成项目集
            progectS[i]=new Node(Capital[i],Profits[i]);
        }
        //建造成本小根堆
        PriorityQueue<Node> capitalQueue=new PriorityQueue<>(new minHeapCompartor());//指定小根堆比较器
        for(int i=0;i<progectS.length;i  ){
            capitalQueue.add(progectS[i]);
        }
        PriorityQueue<Node> profitsQueue=new PriorityQueue<>(new MaxHeapCompartor());//指定大根堆比较器
        for(int i=0;i<k;i  ){
            while (!capitalQueue.isEmpty()&&capitalQueue.peek().cost<=W){
                profitsQueue.add(capitalQueue.poll());
            }
            if (profitsQueue.isEmpty()){
                return W;
            }
           W =profitsQueue.poll().getM;
        }
        return W;
    }


}

0 人点赞