0-1背包问题 题目:国王和金矿问题 描述:有一个国家发现了max_n座金矿,参与挖矿工人的总数是max_people人。每座金矿的黄金储量不同为一维数组gold[],需要参与挖掘的工人数也不同为一维
生活随笔
收集整理的這篇文章主要介紹了
0-1背包问题 题目:国王和金矿问题 描述:有一个国家发现了max_n座金矿,参与挖矿工人的总数是max_people人。每座金矿的黄金储量不同为一维数组gold[],需要参与挖掘的工人数也不同为一维
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目四:0-1背包問題
題目:國王和金礦問題
描述:有一個國家發現了max_n座金礦,參與挖礦工人的總數是max_people人。每座金礦的黃金儲量不同為一維數組gold[],需要參與挖掘的工人數也不同為一維數組peopleNeed[]。每座金礦要么全挖,要么不挖,不能派出一半人挖取一半金礦。要想得到盡可能多的黃金,應該選擇挖取哪幾座金礦?
功能:
??(1) 要求max_n、max_people、gold和ppeopleNeed均為可輸入的;
??(2) 編寫DP函數,求解答案F;
??(3) 編寫main主函數,完成輸入,調用DP函數和顯示答案結果。
樣例輸入1:
5
92 22 87 46 90
100
77 22 29 50 99
樣例輸出1:
133
代碼:
#include<iostream> #include<string.h> #include<algorithm> using namespace std; int main() {int max_n; cin>>max_n; //輸入金礦 int *gold = new int[max_n+1]; //金礦數組,從1開始 int *peopleNeed = new int[max_n+1]; //每個礦需要的人,從1開始 for(int i = 1 ; i <= max_n ; i ++) cin>>gold[i]; //每個金礦容量 int max_people;cin>>max_people; //輸入人的總數 int **dp = new int *[max_n+1]; //先用指針定義,橫坐標是人, 縱坐標是礦 for(int i = 0; i < max_n+1; i++) //開辟空間 dp[i] = new int[max_people+1];for(int i = 0 ; i <= max_people ; i++) //第一列均為0 dp[0][i] = 0;for(int i = 1 ; i <= max_n ; i ++) cin>>peopleNeed[i];for(int i = 1 ; i <= max_n ; i++) for(int j = 0 ; j <= max_people ; j++) if(peopleNeed[i]<=j) //當某礦需要人數<=現有人數時,//最大值等于 沒加這座礦以前這些人能開的最大值,和加上這座礦以后減去對應的人數的最大值比較 dp[i][j] = max(dp[i-1][j],dp[i-1][j-peopleNeed[i]]+gold[i]); else //如果>= 說明該礦開不了, 還等于原來的。 dp[i][j] = dp[i-1][j];cout<<dp[max_n][max_people]<<endl; //輸出最后一行最后一列即可 return 0;}時間復雜度: O(mn),m為金礦數量,n為人數。
總結
以上是生活随笔為你收集整理的0-1背包问题 题目:国王和金矿问题 描述:有一个国家发现了max_n座金矿,参与挖矿工人的总数是max_people人。每座金矿的黄金储量不同为一维数组gold[],需要参与挖掘的工人数也不同为一维的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【绝对有用】Syntax error o
- 下一篇: URI和URL的区别(12万访问量)