动态规划问题,金矿模型的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
初次学习算法的相关问题,有些地方可能考虑的并不周到,还希望大神们及时指出!