输入:

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

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

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

给定一个初始投资资金,给定N个项目,想要获得其中最大的收益,并且一次只能做一个项目。这是一个贪心策咯的问题,按照花费的多少放到一个小根堆里面,然后要是小根堆里面的头节点的花费少于给定资金,就将头节点一个个取出来,放到按照收益的大根堆里面,这样就然后将大根堆 的堆顶弹出。

import java.util.Comparator;
import java.util.PriorityQueue;
public class C04_IPO {
	//一个节点代表一个项目
	public static class Node{
		int profit;//收益
		int cost;//花费
		public Node(int profit,int cost){
			this.profit = profit;
			this.cost = cost;
		}
	}
	/**
	 * 计算最大项目收益k:最多可以做多少个项目,w:总资金,profit:收益,cost:花费
	 * @param k:最多可以做多少个项目
	 * @param w:总资金
	 * @param profit:收益
	 * @param cost:花费
	 * @return
	 */
	public static int ipo(int k,int w,int cost[],int profit[]){
		//小根堆,大根堆
		PriorityQueue<Node>minQueue = new PriorityQueue<Node>(new minHeapCompatator());
		PriorityQueue<Node>maxQueue = new PriorityQueue<Node>(new maxHeapCompatator());
		Node curNode;
		for (int i = 0; i < cost.length; i++) {
			curNode = new Node(profit[i], cost[i]);
			minQueue.add(curNode);
		}
		for (int i = 0; i < k; i++) {
			while(minQueue.peek().cost<w){
				maxQueue.add(minQueue.poll());
			}
			if(maxQueue.isEmpty()){
				return w;
			}
			w += maxQueue.poll().profit;
		}
		return w;
	}
	public static class minHeapCompatator implements Comparator<Node>{
		@Override
		public int compare(Node o1, Node o2) {
			return o1.cost-o2.cost;//按照花费排序的小根堆
		}
	}
	public static class maxHeapCompatator implements Comparator<Node>{
		@Override
		public int compare(Node o1, Node o2) {
			return o2.profit-o1.profit;//按照收益排序的大根堆
		}
	}
	public static void main(String[] args) {
		int[]c = new int[]{10,20,100};
		int[]p = new int[]{11,10,200};
		System.out.println(ipo(c.length, 50,c,p));//71
	}
}