您的位置:首页 > 其它

项目利润(贪心算法)

2018-02-13 20:44 176 查看

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: