做專案的最大收益

2021-09-24 23:33:42 字數 2195 閱讀 8012

輸入: 引數1,正數陣列costs 引數2,正數陣列profits 引數3, 正數k 引數4,正數m

costs[i]   表示i號專案的花費

profits[i]  表示i號專案在扣除花費之後還能掙到的錢(利潤) k表示你不能並行、只能序列的最多 做k個專案 m表示你初始的資金

說明:你每做完乙個專案,馬上獲得的收益,可以支援你去做下 乙個 專案。

輸出: 你最後獲得的最大錢數。

思路:1、定義專案類如下:

class program:

def __init__(self,cost,profit):

self.cost = cost

self.profit = profit

2、生成小根堆costminheap, 可以把具體的program放進costminheap中,根據program的花費來組織小根堆,花費最少的program放在costminheap的堆頂

3、生成大根堆profitmaxheap, 可以把具體的program放進profitmaxheap中,根據program的利潤來組織小根堆,利潤最多的program放在profitmaxheap的堆頂

4、根據costs和profits陣列,可以得到所有的program,把所有的program放進costminheap

5、根據當前的資金w,來解鎖costminheap中的專案,只要是花費小於或等於w的專案,就從costminheap中彈出,放入profitmaxheap。因為costminheap是小根堆,所以依次彈出program,知道costminheap為空或者剩下專案的花費都大於w,彈出過程停止。每乙個從costminheap彈出的program,都進入profitmaxheap。進入步驟6

6、profitmaxheap裝著所有可以被考慮和被解鎖的專案

1)如果經歷了步驟5之後,發現profitmaxheap為空,首先說明當前資金w並沒有解鎖出任何專案,其次說明目前已經沒有任何專案可以挑選啦,直接返回w

2)如果經歷了步驟5解鎖之後,發現profitmaxheap不為空。選擇位於profitmaxheap堆頂的那個專案完成,標記為programbest,因為在所有可以被考慮的專案中,profitmaxheap堆頂的專案一定是獲得利潤最多的專案。完成programbest之後,可以獲得programbest的利潤。所以w+=programbest.profit。然後重複步驟5,進行新一輪的解鎖。

7、如果步驟6進行的過程中沒有返回。那麼做完k個專案後,返回w

"""偽**如下"""

class program:

def __init__(self,cost,profit):

self.cost = cost

self.profit = profit

def getmaxmoney(w,k,costs,profits):

if w < 1 or k < 0 or costs == none or profits == none or len(costs) != len(profits):

return w

"""專案花費小根堆,花費最少的專案在頂部

"""costminheap = costminheap()

"""專案利潤大根堆,利潤最大的專案在頂部

"""profitmaxheap = profitmaxheap()

"""所有專案都進花費小根堆"""

for i in range(len(costs)):

costminheap.add(costs[i],profits[i])

"""依次做k個專案"""

for i in range(k+1):

"""當前資金為w,在專案花費小根堆裡所有花費小於或等於w的專案,都可以考慮"""

while (!costminheap.isempty() and costminheap.peek().cost <= w):

"""把可以考慮的專案都放進專案利潤大根堆裡"""

profitmaxheap.add(costminheap.poll())

"""如果此時專案利潤大根堆為空,說明可以考慮的專案為空,說明當前資金w已經無法解鎖任何專案,直接返回w"""

if (profitmaxheap.isempty()):

return w

w += profitmaxheap.poll().profit

return w

做專案的最大收益問題

給定兩個整數w和k,w代表你擁有的初始資金,k代表你最多可以做k個專案。再給定兩個長度為n的正數陣列costs和profits,代表一共有n個專案,costs i 和profits i 分別表示第i號專案的啟動資金與做完後的利潤 注意是利潤,如果乙個專案的啟動資金為10,利潤為4,代表該專案最終的收...

最大收益問題

time limit 2000ms memory limit 65536k 有疑問?點這裡 鐵牌狗最近迷上了一款遊戲,但鐵牌狗實在是太笨了,他還是要請求你的幫助。有乙個n行m 列的矩陣 a,矩陣 a中每個數字均為正整數,現在鐵牌狗要在其中選出乙個r行 c列的子矩陣 b,這個子矩陣 b中各個數字之和即...

公司最大收益

一家家具公司生產桌子和椅子。現有113個單位的木材。每張桌子要使用20個單位的木材,售價是30元 每張椅子要用16個單位的木材,售價是20元。使用已有的木材生產桌椅 不一定要用光木材 最多可以賣多少錢?首先我們看這個問題,我們能發現這是乙個優化問題,是在某種約束條件下求目標的最優值。對於這個問題來說...