首页 > 试题广场 >

做项目的最大收益问题

[编程题]做项目的最大收益问题
  • 热度指数:3016 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定两个整数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 

备注:

来个Python3版本的

N, W, K = (int(_) for _ in input().strip().split())
if N <=0:
    print(W)
costs = [int(_) for _ in input().strip().split()]
profits = [int(_) for _ in input().strip().split()]
items = [(a, b) for a, b in zip(costs, profits)]
import heapq
heapq.heapify(items)  # 先把所有项目按照花费的小根堆组织起来
more_q = []  # 大根堆按照profits组织
# 循环 K 次选择 K 个项目
for i in range(K):
    # 把当前资金能做的项目从小根堆中弹出,并进入大根堆
    while len(items)>0 and items[0][0] <= W:
        one_item = heapq.heappop(items)
        heapq.heappush(
            more_q, (-one_item[1],) + one_item
        )  # 由于默认小根堆,所以把利润取反后push进小根堆,就是大根堆了
    # 循环结束时, one_item 是当前轮初始资金不能做的
    if len(more_q) == 0: # 如果大根堆没有元素了,代表当前的资金无法做任何项目了,可以提前停止了
        break

    # 从大根堆中取出一个项目做,并把收益加到资金中
    do_item = heapq.heappop(more_q)[1:]
    W +=  do_item[1]
print(W)
发表于 2023-03-15 22:17:42 回复(0)

问题信息

上传者:小小
难度:
1条回答 5252浏览

热门推荐

通过挑战的用户

查看代码