國王和金礦問題_動態規划


 

這是一個典型的0-1背包問題,工人總數可以看為背包的容量,金礦的個數可以看為物品的個數,金礦的含金量可以看作物品的價值,金礦的使用工人數可以看作物品所占空間數,這樣一來就變成了0-1背包問題,關於0-1背包問題的解法可以看我這篇博客https://www.cnblogs.com/henuliulei/p/10041737.html代碼只要把變量改改名字就完全可以適應這個問題了

代碼如下,就不加詳解了,注意金礦輸入的順序如下

 

代碼如下

#include<bits/stdc++.h>
using namespace std;
int n;//金礦總個數
int array1[100];//金礦含金量
int array3[100];//金礦對應的工人數
int capacity;//礦工的總人數
int array2[100+1][100+1];//最大金礦收益
 int array4[100]={0};//記錄采那些礦
int f(int n,int array1[],int array3[]){
 for(int i=0;i<=n;i++){
    array2[i][0]=0;
   }
   for(int j=0;j<=capacity;j++){
    array2[0][j]=0;
   }
   for(int i=1;i<=n;i++){
    for(int j=1;j<=capacity;j++){
        if(j<array3[i]){
            array2[i][j]=array2[i-1][j];
        }else{
           array2[i][j]=max(array2[i-1][j],array2[i-1][j-array3[i]]+array1[i]);
        }
    }
   }
   int s=capacity;
   for(int j=n;j>0;j--){
    if(array2[j][s]>array2[j-1][s]){
           array4[j]=1;
           s=s-array3[j];
    }
   }
   return array2[n][capacity];
}
int main()
{
    cout << "請輸入金礦的總個數"<< endl;
    cin >> n;
    cout << "請依次輸入每個的含金量" << endl;
    memset(array1,0,sizeof(array1));
    for(int i=1;i<=n;i++){
        cin >> array1[i] ;
    }
      cout << "請依次輸入沒個金礦的工人數" << endl;
      memset(array3,0,sizeof(array3));
    for(int i=1;i<=n;i++){
        cin >> array3[i] ;
    }
      cout << "請輸入總共的工人數";
    cin >> capacity;
   memset(array2,0,sizeof(array2));
   memset(array4,0,sizeof(array4));
    cout << "可獲的最大金礦" << f(n,array1,array3) << endl;
    cout << "需要采的礦是:";
    for(int i=1;i<=n;i++){
        if(array4[i]==1){
            cout <<""<< i << " ";
        }
    }

    return 0;
}

運行結果如下

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM