输入:
参数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
}
}