問題描述:
有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,每座金礦要麼全挖,要麼不挖,不能派出一半人挖取一半的金礦,想要得到盡可...