动态规划问题,金矿模型的java实现

本文介绍了如何用Java实现动态规划解决金矿模型问题。参考了一篇浅显易懂的博客,并给出了具体的代码实现。案例中,输入包括金矿数量和每个金矿的人力需求及产出金子数,输出为最大收益。文章作者期待反馈和指导。
摘要由CSDN通过智能技术生成

动态规划问题,金矿模型的java实现

最近在学习动态规划的算法,看到了很多的博客,介绍的都非常好,这里贴出一个浅显易懂的文章:http://blog.csdn.net/u013446688/article/details/38079035,看了之后深受启发,因此使用java进行了实现,代码如下,多多指教:



//构造问题所对应的过程
//思考过程的最后一个步骤,看有哪些情况
//找到最后一步的子问题,确保符合子问题最优
//找到边界,考虑边界的各种处理方式
//确保子问题独立
//考虑号怎样记录上一步的结果
//写出转移方程
public class DP {
    private static int maxGoldNum=0;
    private int peopleTotal=100; //总共可以使用的工人数量

    private int[][] maxGold=new int[100][100];
    /*i个人挖钱j个金矿能够获得的最大金子数量   此处的数组长度可以通过大概计算得出,我这里大概写了一个值没有计算,计算方法在上面推荐的文章中有讲解*/

    private int[] goldNum;//每座金矿能够挖出的最大金子的数量

    private int[] peopleNeeded;//每座金矿所需要的工人数量
    public static void main(String[] args) {
        // TODO Auto-generated method stub
         DP dp=new DP();
         int x=dp.maxGold(dp.peopleTotal, dp.goldNum.length-1);
         System.out.println(x);

    }

    public DP(){
        this.peopleTotal=100;
        this.peopleNeeded=new int[]{77,22,29,50,99};
        this.goldNum=new int[]{92,22,87,46,90};
        for(int[] row:this.maxGold){
            for(int col:row){
                col=0;
            }
        }
    }

    public int  maxGold(int peopleLeft,int mineNum){
        /*此处的判断条件用0好像不是很好,可以选择其他值在初始化的时候可以区分的值即可*/
        if(this.maxGold[peopleLeft][mineNum]!=0){
            maxGoldNum=this.maxGold[peopleLeft][mineNum];

        }
        else if(mineNum==0){
            if(peopleLeft>=this.peopleNeeded[0]){
                maxGoldNum=this.goldNum[0];
                return maxGoldNum;
            }else{
                maxGoldNum=0;
                return maxGoldNum;
            }
        }else if(peopleLeft>this.peopleNeeded[mineNum]){
            maxGoldNum=(this.maxGold(peopleLeft-this.peopleNeeded[mineNum],mineNum-1)+this.goldNum[mineNum])>this.maxGold(peopleLeft,mineNum-1)?(this.maxGold(peopleLeft-this.peopleNeeded[mineNum],mineNum-1)+this.goldNum[mineNum]):this.maxGold(peopleLeft,mineNum-1);
        }else{
            maxGoldNum=this.maxGold(peopleLeft,mineNum-1);
        }
        return maxGoldNum;
    }


}

输入的案例引用的上面所提文章中的案例:我这里数据在初始化的时候就赋值了,也可以通过用户输入或者读取文件的方式获得,第一行是peopleTotal和goldNum数组的长度(金矿的数量)从第二行开始第一个数是该金矿需要的人,第二个数是该金矿能够挖出的金子数

100 5
77 92
22 22
29 87
50 46
99 90


结果为:

133


初次学习算法的相关问题,有些地方可能考虑的并不周到,还希望大神们及时指出!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值