IPO-贪心

本文介绍了一种算法,用于解决如何在有限资本下选择最多k个项目,以最大化最终资本。通过优先级队列实现纯利润大根堆和资本小根堆,确保在满足资本条件时优先选择高收益项目。代码展示了如何使用Comparator进行项目比较和资本累积的过程。
摘要由CSDN通过智能技术生成
  • 题目

给你 n 个项目。对于每个项目 i ,它都有一个纯利润 profits[i] ,和启动该项目需要的最小资本 capital[i] 。
最初,你的资本为 w 。当你完成一个项目时,你将获得纯利润,且利润将被添加到你的总资本中。
总而言之,从给定项目中选择 最多 k 个不同项目的列表,以 最大化最终资本 ,并输出最终可获得的最多资本。

  • 示例

输入:k = 2, w = 0, profits = [1,2,3], capital = [0,1,1]
输出:4

  • 算法

在可以做的前提下,优先做钱多的项目。
做完项目后资本增加
一个纯利润大根堆,一个资本小根堆
将满足资本小于等于已有资本的项目从小根堆出拿出放入大根堆,取堆顶项目做。

  • 代码
class Solution {
    public class Project{
        private int profit;
        private int capital;

        public Project(int profit, int capital) {
            this.profit = profit;
            this.capital = capital;
        }
    }
    public class MaxProfit implements Comparator<Project> {
        public int compare(Project o1, Project o2) {
            return o2.profit - o1.profit;
        }
    } 
    public class MinCapital implements Comparator<Project> {
        public int compare(Project o1, Project o2) {
            return o1.capital - o2.capital;
        }
    }   
    public int findMaximizedCapital(int k, int w, int[] profits, int[] capital) {
        PriorityQueue<Project> maxProfit = new PriorityQueue<>(new MaxProfit());
        PriorityQueue<Project> minCapital = new PriorityQueue<>(new MinCapital());
        
        for (int i = 0; i < profits.length; i++) {
            minCapital.add(new Project(profits[i], capital[i]));
        }

        for (int i = 0; i < k; i++) {
            while (!minCapital.isEmpty() && minCapital.peek().capital <= w) {
                maxProfit.add(minCapital.poll());
            }
            if (maxProfit.isEmpty()) {
                return w;
            }
            w += maxProfit.poll().profit;
        }
        return w;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值