動態規劃 求解金礦問題

2021-10-09 02:40:28 字數 1670 閱讀 9403

題目描述:

很久很久以前,有乙個國王擁有5座金礦,每座金礦的**儲量不同,需要參與挖掘的工人人數也不相同。例如:有的金礦儲存量是500kg**,需要5個工人來挖;有的金礦儲存量是200kg**,需要3個工人來挖…

如果參與挖礦的工人總數是10,每座金礦要麼全挖,要麼不挖,不能派出一半人挖取一半的金礦,想要得到盡可能多的**,應該選擇挖哪幾座金礦?

資料資訊如下:

工人:共10名

200kg**/3人;300kg**/4人;400kg**/5人;500kg**/5人;350kg**/3人;

求:挖哪幾座金礦才能得到最多的**?

問題解析:

根據最後乙個金礦有挖和不挖問題可以劃分為兩個子結構:

至於選擇哪乙個子結構,就要看在倒數第二個金礦挖與不挖的取值了;以此類推,把問題劃分為最小的結構;直到還剩0座金礦或者還剩0個工人為止。

設金礦數量為n,工人數量為w,金礦的含金量為陣列g,金礦所需開採人數的陣列為p,設f(n,w)為n個金礦,w個工人時的最優收益函式。

則:狀態轉移方程如下:

金礦數為0或者工人數為0的情況:f(n,w)=0(n=0或者w=0)

當所剩工人不夠挖掘當前金礦(n金礦)時,只有一種最優子結構,即該金礦不挖(人沒有減少,但是金礦數減1,說明不挖當前金礦),此時,f(n,w)=f(n-1,w)

在常規情況下,有兩種最優子結構:

(當前金礦指的是n金礦,以下是n金礦不挖和n金礦挖時的情況)

f(n,w)=max(f(n-1,w),f(n-1,w-p[n])+g(n))

def

get_best_gold_mining

(w,p=

,g=)

:'''

:param w: 工人總量

:param p: 開採金礦所需要的對應人數

:param g: 每座金礦的**儲量

:return:

'''result_table=[[

0for i in

range

(w+1)]

for i in

range

(len

(g)+1)

]# 填充**

for i in

range(1

,len

(g)+1)

:# 當前金礦是否選擇開採

for j in

range(1

,w+1):

# 當前的工人人數

if j:# p的下標是從0開始的,所以只能減1才能和當前金礦對應起來

result_table[i]

[j]=result_table[i-1]

[j]#工人不夠,當前金礦只能選擇不挖,所以價值是上乙個金礦的最優子結構

else

: result_table[i]

[j]=

max(result_table[i-1]

[j],result_table[i-1]

[j-p[i-1]

]+g(i-1)

)# p[i-1]是金礦i對應的開採人數,g[i-1]是金礦i對應的**儲量

return result_table[

len(g)

][w]

動態規劃 如何求解金礦問題

漫畫演算法 小灰的演算法之旅 5.11 假設現在有5座金礦,每座金礦的 儲存量不同,需要參入挖掘的工人人數也不同。要求 參入挖礦的工人的總數是10.每座金礦要麼全挖,要麼不挖,不能派出一半人挖取一般 要求用程式求出,要想得到盡可能多的 應該選取那幾座金礦?金礦內容 400,500,200,300,3...

動態規劃 金礦模型

問題描述 有people個人和 num個金礦,開採 每個金礦都需要i people個人,可以獲得i getgold個金子,並且用過的人不可以重複使用,問從這 num個金礦中最多可以得到多少個金子 輸入輸入第一行有兩個數,第乙個是用來開採金礦的總人數,第二個是總金礦數。輸入檔案的第2至n 1行每行有兩...

動態規劃 挖金礦

有乙個國家發現了5座金礦,每座金礦的 儲量不同,需要參與挖掘的工人數也不同。參與挖礦工人的總數是10人。每座金礦要麼全挖,要麼不挖,不能派出一半人挖取一半金礦。要求用程式求解出,要想得到盡可能多的 應該選擇挖取哪幾座金礦?500金 5人 200 3 300 4 350 3 400 5 總容量 10人...