動態規劃 金礦模型

2021-06-26 15:29:06 字數 1375 閱讀 6818

問題描述:

有people個人和

num個金礦,開採

每個金礦都需要i_people個人,可以獲得i_getgold個金子,並且用過的人不可以重複使用,問從這

num個金礦中最多可以得到多少個金子;

輸入輸入第一行有兩個數,第乙個是用來開採金礦的總人數,第二個是總金礦數。

輸入檔案的第2至n+1行每行有兩個數,第i行的兩個數分別表示第i-1個金礦需要的人數和可以得到的金子數。

輸出輸出乙個整數,表示能夠得到的最大金子數。

輸入樣例;

100 5

77 92

22 22

29 87

50 46

99 90

輸出樣例

133

下面給出c語言**:

#include#include#define max_people 10000//程式最多支援的人數

#define max_gold 100//程式最多支援的金礦個數

int total_people;//可用來挖金礦的總人數

int total_gold;//總金礦個數

int i_people[100];//挖第i個金礦所需的人數,程式中第i個金礦用下標i-1表示

int i_getgold[100];//挖第i個金礦可以得到的金子數目

int max_gold[max_people][max_gold];//max[i][j]儲存了i個人挖前j個金礦(0 -- j-1)能得到的最多金子數目,-1表示未知

//資料初始化

int max(int a,int b)

void getdata()

memset(max_gold,-1,sizeof(max_gold));//將該陣列全部賦值為-1,基於標頭檔案}

//獲取people個人開採前num個金礦可以得到的最大金子數

int getmaxgold(int people,int num)//引數意義:people為可以使用的人數,num為可以開採的金礦個數

else if(num == 0)//若可開採的金礦只有乙個,即動態規劃的「邊界條件」

else if(people >= i_people[num])//若people個人滿足開採該金礦,則考慮兩種情況(該礦是否開採),取其中的最大值

else //people個人不滿足開採該金礦,則只用考慮一種情況(不開採該金礦)

maxgold = getmaxgold(people,num - 1);

max_gold[people][num] = maxgold;//記錄下當前最多的金子數目,動態規劃中的做備忘錄

return maxgold;

}int main()

動態規劃 挖金礦

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

動態規劃 國王與金礦

題目 有乙個國家發現了5座金礦,每座金礦的 儲量不同,需要參與挖掘的工人數也不同。參與挖礦工人的總數是10人。每座金礦要麼全挖,要麼不挖,不能派出一半人挖取一半金礦。要求用程式求解出,要想得到盡可能多的 應該選擇挖取哪幾座金礦?遞迴實現public static void main string a...

動態規劃 求解金礦問題

題目描述 很久很久以前,有乙個國王擁有5座金礦,每座金礦的 儲量不同,需要參與挖掘的工人人數也不相同。例如 有的金礦儲存量是500kg 需要5個工人來挖 有的金礦儲存量是200kg 需要3個工人來挖 如果參與挖礦的工人總數是10,每座金礦要麼全挖,要麼不挖,不能派出一半人挖取一半的金礦,想要得到盡可...