贪心算法(项目利润问题)

输入:正数数组costs
正数数组profits
正数k
正数m
含义:
costs[i]表示i号项目的花费(成本)
profits[i]表示i号项目的利润
k表示你只能串行的做k个项目
m表示你初始的资金
说明:你每做完一个项目,马上获得的收益,可以支持你去做下一个项目
输出:你最后获得的最大钱数。

在这里插入图片描述
解题思路:准备一个小根堆和一个大根堆,小根堆是按照成本排序。将小根堆<=M的项目弹出到大根堆(大根堆按照利润排序)。然后完成大根堆最上面的项目更新本金。

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

public class IPO{
	public static class Node{
		public int p;
		public int c;

		public Node(int p,int c){
			this.p = p;
			this.c = c;
		}
	}

	public static class MinCostComparator implements Comparator<Node>{
		public int compare(Node o1,Node o2){
			return o1.c - o2.c;
		}
	}

	public static class MaxProfitComparator implements Comparator<Node>{
		public int compare(Node o1 , Node o2){
			return o2.p - o1.p; 
		}
	}

	public static int findMaxCapital(int k,int w,int[] Profits,int[] Capital){
		PriorityQueue<Node> minCostQ = new PriorityQueue<>(new MinCostComparator());
		PriorityQueue<Node> maxProfitQ = new PriorityQueue<>(new MaxProfitComparator());
		for(int i = 0 ; i < Profits.length; i++){
			minCostQ.add(new Node(Profits[i], Capital[i]));//按照成本从小到大放入小根堆
		}
		for(int i = 0 ; i < k; i++){//进行k轮
			//能力所及的项目全解锁
			while(!minCostQ.isEmpty() && minCostQ.peek().c <= w){
				maxProfitQ.add(minCostQ.poll());
			}
			if(minCostQ.isEmpty()){
				return w;
			}
			w += maxProfitQ.poll().p;
		}
		return w;
	}
 
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值