给定两个整数W和K,W代表你拥有的初始资金,K代表你最多可以做K个项目。再给定两个长度为N的正数数组costs[]和profits[],代表一共有N个项目,costs[i]和profits[i]分别表示第i号项目的启动资金与做完后的利润(注意是利润,如果一个项目的启动资金为10,利润为4,代表该项目最终的收入为14)。你不能并行只能串行地做项目,并且手里拥有的资金大于或等于某个项目的启动资金时,你才能做这个项目。该如何选择做项目,能让你最终的收益最大?返回最后能获得的最大资金
[要求]
时间复杂度为,空间复杂度为
输入描述:
第一行三个整数N, W, K。表示总的项目数量,初始资金,最多可以做的项目数量 第二行有N个正整数,表示costs数组 第三行有N个正整数,表示profits数组
输出描述:
输出一个整数,表示能获得的最大资金
示例1
输入
4 3 2 5 4 1 2 3 5 3 2
输出
11
说明
初始资金为3,最多做两个项目,每个项目的启动资金与利润见costs和profits。最优选择为:先做2号项目,做完之后资金增长到6,。然后做1号项目,做完之后资金增长到11。其他的任何选择都不会比这种选择好,所以返回11
这个是循环,网上还有用堆来做的,还需要再看。
另外:
1.两行int 中需要加一行 scanner.nextLine(),不然有空指针。
2.注意int 的范围,应该使用long。
import java.util.*;
//一个项目可以做多次吗?
public class Main {
public static void main(String args[]){
Scanner scanner=new Scanner(System.in);
int projectNum=scanner.nextInt();
int initialMoney=scanner.nextInt();
int canDo=scanner.nextInt();
project[] projects=new project[projectNum];
int costs[]=new int[projectNum];
int profits[]=new int[projectNum];
for (int i = 0; i <projectNum ; i++) {
costs[i]=scanner.nextInt();
// projects[i].cost=scanner.nextInt();
}
scanner.nextLine();
for (int i = 0; i <projectNum ; i++) {
profits[i]=scanner.nextInt();
// projects[i].profit=scanner.nextInt();
}
scanner.close();
for (int i = 0; i <projectNum ; i++) {
project project=new project(costs[i],profits[i]);
projects[i]=project;
}
System.out.println(getMaxProfit(projects,Long.valueOf(initialMoney),canDo));
}
static class project {
int cost;
int profit;
public project(int cost,int profit){
this.cost=cost;
this.profit=profit;
}
}
static class projectCompartor implements Comparator<project>{
@Override
public int compare(project o1, project o2) {
return o1.profit!=o2.profit?o2.profit-o1.profit:o1.cost-o2.cost;
}
}
public static Long getMaxProfit(project[] projects,Long initailMoney,int canDo){
if(projects==null||projects.length == 0) return 0L;
Arrays.sort(projects, new projectCompartor());
// List<project> list = new LinkedList<>();
// for (int i = 1; i <projects.length ; i++) {
// if(projects[i].profit<=projects[i-1].profit){
// list.remove(projects[i]);
// }
// }
//List<project> list = new LinkedList<>();
// list=Arrays.asList(projects);
int num=0;
// Integer profit=0;
// while(num<canDo){
// if(initailMoney>projects[num].cost){
// profit=profit+initailMoney+projects[num].profit;
// initailMoney=profit;
// num++;
// }
// }
for(int i=0;i<canDo;i++){
for(int j=0;j<projects.length;j++){
if(initailMoney>=projects[j].cost){
initailMoney += projects[j].profit;
// initailMoney=profit;
projects[j].cost = Integer.MAX_VALUE;
break;
}
}
}
return initailMoney;
}
}