zoukankan      html  css  js  c++  java
  • 动态规划-挖金矿

    //有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同。
    //参与挖矿工人的总数是10人。
    //每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。
    //要求用程序求解出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿?
    /*
    500金/5人    200/3 300/4 350/3 400/5
    */
    /*
    总容量:10人
    可选量:5人
    n=10,c=5;
    表前i座金山占用j人所拥有的最大黄金
    状态转移方程
    1.j>wi
    F(i,j)=F(i-1,j);
    2.j<=wi
    F(i,j)=max(F(i-1,j),F(i-1,j-wi)+vi);
    */
     
    #include<iostream>
    #include<cstring>
    #include<cmath> 
    #include<string> 
    #include<cstdlib>
    #include<algorithm>
    using namespace std;
    typedef struct node{
     int w;
     int v;
    } Node;
    Node Moun[6];
    Node Orign[6];
    int c=10,n=5; 
    bool cmp(Node a,Node b){
     if(a.v==b.v)
      return a.w<b.w; 
     return a.v>b.v;
    }
    void copy(){
     for(int i=1;i<=n;i++){
      Orign[i].w=Moun[i].w;
      Orign[i].v=Moun[i].v;
     } 
    }
    int main(){
     int F[6][11];//备忘录 
     int book[6];//标记选取的金山 
     int w[6],v[6];
     //初始化
     memset(F,0,sizeof(F));
     memset(book,0,sizeof(book));
     //存入数据 500金/5人    200/3 300/4 350/3 400/5
     Moun[1].v=500,Moun[1].w=5;
     Moun[2].v=200,Moun[2].w=3;
     Moun[3].v=300,Moun[3].w=4;
     Moun[4].v=350,Moun[4].w=3;
     Moun[5].v=400,Moun[5].w=5;
     //复制原金山位置,方便以后求最优解 
     copy();
     //按比率排序
     sort(Moun+1,Moun+n+1,cmp); 
     //自底向上更新备忘录,找最优值 
     for(int i=1;i<=n;i++){
      for(int j=1;j<=c;j++){
       if(Moun[i].w<=j){
        F[i][j]=max(F[i-1][j],F[i-1][j-Moun[i].w]+Moun[i].v);
       }else{
        F[i][j]=F[i-1][j];
       }
      } 
     } 
     //自顶向下 求最优解
     int tmp=10;
     int k=0;
     for(int i=n;i>=1;i--){
      if(F[i][tmp]!=F[i-1][tmp]){//不相同说明放入 
       book[k++]=i;  
      }else{
       tmp-=Orign[i].w;
      }
     } 
     //输出最优质值 
     cout<<"输出最优质值:"<<endl; 
     cout<<F[5][10]<<endl;
     //输出最优解
     cout<<"输出最优解:"<<endl; 
     for(int i=0;i<k;i++){
      cout<<"第"<<book[i]<<"座金山"<<endl;
     }
     return 0;
    }
    

    结果:

    输出最优质值:
      900
    输出最优解:
      第2座金山
      第1座金山

     
  • 相关阅读:
    System.Data.RealonlyException:列Column1被设置为realonly
    学习java过程中
    在windows server 2008下安装vs2005.打开vs2005的时候老提示要“运行vs2005sp1 建议使用管理员权限”
    windows Server 2008下面运行vs2005的问题
    大飞机MIS系统360把我的Transformer.Service服务杀掉了
    开通博客
    C#中怎样让控件显示在其他控件的上面
    vs2010发布问题
    vs在IE8无法调试的解决方法
    将身份证号粘贴到WPS表格后变成了“科学计数法”的解决方案
  • 原文地址:https://www.cnblogs.com/Anthony7/p/10810362.html
Copyright © 2011-2022 走看看