動態規劃的原理就很少講了,網上一大堆,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 }