動態規劃系列(2) 收益最大問題

2021-08-21 20:04:51 字數 1537 閱讀 8569

考慮乙個問題,如果有多個任務,每個任務有自己存在時間段(任務之間的時間段可能有重複),求如果選擇任務可以使收益最大化,計算收益時,每個任務段之間不能有重合。我們舉個實際的例子,存在8個任務,如下圖所示,圖中標明了每個任務的時間段和收益。

這個問題我們這樣考慮,從頭到尾,當看到乙個任務時,此時不考慮排在後面的任務,考慮在選擇不選擇這個任務時各自的收益,然後選其中的最大值。

第1個任務:選擇時收益為5,不選時則不做任何任務收益為0,。所以面對第乙個任務時的最大收益為5;

我們可以寫乙個優化過程的公式,其中opt代表optimizer(最佳方案),分成選擇和不選擇當前任務兩種情況,如果選擇的話,當前任務的收益和之前可以最近一次時間不衝突的任務的收益;不選擇的話,上一次任務情況下的收益。

根據上面過程可以計算得出下面的結果

按照上面的思路編寫**,首先根據題目求出不選擇本次任務時,上一次的任務標號 。

# -*- coding: utf-8 -*-

'''假設有8個任務需要完成,每個任務有各自的時間段,8個任務間任務段可能存在重合,如何選擇任務使最後是收益最大

下面為8個任務的時間段

0 1 2 3 4 5 6 7 8 9 10 11

******5******

****1****

************8************

*******4*****

***********6*********

********3*******

********2********

*********4****

*所覆蓋的範圍代表所經歷的時間段,其中的數字代表這個任務可以帶來的收益

'''def maxincome():

tast_incomes = [5,1,8,4,6,3,2,4] # 每項任務的收入

# 根據時間段的重合情況計算,如果選擇當前任務的話,前面的離得最近的可以做的任務

prev = [-1,-1,-1,0,-1,1,2,4] # -1代表如果選擇當前任務的話,之前沒有可選的任務

# 在面臨每項任務時,選擇或者不選擇的最大收益

result = [tast_incomes[0]]

for i in range(1,8):

if prev[i] == -1:

else:

return max(result)

if __name__ == '__main__':

print(maxincome())

乘積最大問題 動態規劃

洛谷p1018 今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為n的數字串,要求選手使用...

問題 P 動態規劃 收益

題目描述 建太空梯進入太空要1兆億?魔法學院的院長瞪大了眼睛。這只是基礎設施的費用,後期還要 墨老師掰著手指算。哎呀,現在地主也很窮啊,學院的錢批下來就這麼多,你想辦法用這筆錢在債券市場上獲得最大收益吧。院長皺著眉頭。簡單來說,就是你有一筆錢,你要將這筆錢去投資債券,現在有d種債券,每種債券都有乙個...

動態規劃問題系列 Disk Schedule

有很多從磁碟讀取資料的需求,包括順序讀取 隨機讀取。為了提高效率,需要人為安排磁碟讀取。然而,在現實中,這種做法很複雜。我們考慮乙個相對簡單的場景。磁碟有許多軌道,每個軌道有許多扇區,用於儲存資料。當我們想在特定扇區來讀取資料時,磁頭需要跳轉到特定的軌道 具體扇區進行讀取操作。為了簡單,我們假設磁頭...