首页 > 代码库 > 动态规划代码 加注释

动态规划代码 加注释

动态规划的原理就不多讲了,网上一大堆,google一下就明白了,直接上代码

 

 1 public class DynamicPlan {
 2     // 100 个人 挖 5 个矿
 3     private static int peopleCount=100;
 4     private static int poolCount=5;
 5     // 挖每个矿时需要的人数
 6     private static int[] peopleNeed={77,22,29,50,99};
 7     // 每个矿可以挖出来的金币数
 8     private static int[] goldEach={92,22,87,46,90};
 9     // 挖矿中间过程的备忘
10     private static Integer[][] backup=new Integer[100][5];
11     public static void main(String[] args) {
12         for(int i=0;i<peopleCount;i++) {
13             for(int j=0;j<poolCount;j++) {
14                 backup[i][j]=-1;
15             }
16         }
17         int max=getMaxGold(peopleCount-1,poolCount-1);
18         System.out.println(max);
19     }
20     
21     public static int getMaxGold(int peopleCount,int poolNum) {
22         int maxGold=0;
23         //m个人挖n个矿时金币数的备忘,遇到相同数量时直接得到结果
24         if(backup[peopleCount][poolNum]!=-1) {
25             maxGold=backup[peopleCount][poolNum];
26         } else if(poolNum==0) {
27             // 只剩下一个矿,人数够,金币数为矿值,人数不够为0
28             if(peopleCount>=peopleNeed[poolNum]) {
29                 maxGold=goldEach[poolNum];
30             } else {
31                 maxGold=0;
32             }
33         } else if(peopleCount>=peopleNeed[poolNum]) {
34             // 不是只剩下一个矿,且人数大于挖当前矿需要的人数,
35             // 挖当前矿时,获得的最大金币为 剩下的人数减去挖当前矿需要的人数 去挖 除去当前矿剩下的矿获得的金币值 加上当前矿能挖出的金币值
36             // 不挖当前矿时,获得的最大金币为 当前剩下的所有人 去挖 除去当前矿剩下的矿获得的金币值
37             // 两者中的最大值为 剩余人数挖剩余矿时获得金币的最大值
38             maxGold=Math.max(getMaxGold(peopleCount-peopleNeed[poolNum],poolNum-1)+goldEach[poolNum],
39                     getMaxGold(peopleCount,poolNum-1));
40         } else {
41             // 不是只剩下一个矿,剩余人数小于挖当前矿需要的人数,
42             // 当前剩下的所有人数去挖除去当前矿剩下的矿所得的金币数
43             maxGold=getMaxGold(peopleCount,poolNum-1);
44         }
45         // 将当前人数挖当前矿数获得金币的最大值保存
46         backup[peopleCount][poolNum]=maxGold;
47         return maxGold;
48     }
49 }