題目描述:
很久很久以前,有乙個國王擁有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人...