刷题-项目收益最大化

给定两个整数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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值