项目利润(贪心算法)

输入: 参数1,正数数组costs 参数2,正数数组profits 参数3,正数k 参数4,正数m

costs[i]表示i号项目的花费 profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润) k表示你不能并行、只能串行的最多做k个项目 m表示你初始的资金

说明:你每做完一个项目,马上获得的收益,可以支持你去做下一个 项目。

输出: 你最后获得的最大钱数


每一贪心类的题,都有一个贪心策略,这道题,用到的贪心策略:

当你的资金有限时怎么选择去做那个项目能挣的钱比较多?

肯定是在自己能做的项目中找最赚钱的

package basic_class_04;
import java.util.*;
public class Main {
	private static class Node {
		public int p;
		public int c;
		public Node(int p, int c) {
			this.p = p;
			this.c = c;
		}
	}
	
	
	private static class MinProfitComparator implements Comparator<Node>{

		@Override
		public int compare(Node o1, Node o2) {
			// TODO Auto-generated method stub
			return o1.p-o2.p;
		}	
	}
	private static class MaxCostComparator implements Comparator<Node>{

		@Override
		public int compare(Node o1, Node o2) {
			// TODO Auto-generated method stub
			return o2.c-o1.c;
		}	
	}
	
	
	public static int LessMoney(int k, int W, int[] Profits, int[] Capital){
		PriorityQueue<Node> Min = new PriorityQueue<Node>(11,new MinProfitComparator());
		PriorityQueue<Node> Max = new PriorityQueue<Node>(11,new MaxCostComparator());
		for(int i=0;i<Profits.length;i++){
			Min.add(new Node(Profits[i],Capital[i]));
		}
		int money=W;
		for(int i=0;i<k;i++){
			while(Min.peek().p<=money){
				Max.add(Min.poll());
			}
			Node priority = Max.poll();
			money -=priority.p;
			money +=priority.c;
		}
		return money;
		
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	}
	
		

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SUNbrightness

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值