動態規劃代碼 加註釋

動態規劃的原理就很少講了,網上一大堆,google一下就明白了,直接上代碼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 }
相關文章
相關標籤/搜索