有一個國家發現了5座金礦,每座金礦的黃金儲量不同,需要參與挖掘的工人數也不同。參與挖礦工人的總數是10人。每座金礦要麼全挖,要麼不挖,不能派出一半人挖取一半金礦。要求用程序求解出,要想得到儘可能多的黃金,應該選擇挖取哪幾座金礦?
第一個 400金/5人 第二個500金/5人, 第三個200金/3人, 第四個300/4人, 第五個350/3人
代碼如下:
/**
* Created by Owen Chan
* On 2018-01-27.
*/
public class GoldDig {
public static void main(String[] argv) {
System.out.println("Most gold");
int worker = 10;
int[] gold = new int[]{400, 500, 200, 300, 350};
int[] person = new int[]{5, 5, 3, 4, 3};
getMostGold(worker, gold, person);
System.out.println("Most gold: " + getMostGold(worker, gold, person));
}
private static int getMostGold(int worker, int[] gold, int[] person) {
int[] preArray = new int[worker];
int[] tempArray = new int[worker];
for (int i = 0; i < worker; i++) {
preArray[i] = person[0] <= i + 1 ? gold[0] : 0;
System.out.println(preArray[i]);
}
for (int goldIndex = 1; goldIndex < gold.length; goldIndex++) {
for (int workerIndex = 0; workerIndex < worker; workerIndex++) {
int lastWorker = workerIndex + 1 - person[goldIndex]; // 所剩工人
if (lastWorker > 0) { //所剩工人大於零
tempArray[workerIndex] = Math.max(preArray[lastWorker - 1] + gold[goldIndex], preArray[workerIndex]);
} else if (lastWorker == 0) { //所剩工人數等於零
tempArray[workerIndex] = Math.max(gold[goldIndex], preArray[workerIndex]);
} else { //所剩工人數小於零
tempArray[workerIndex] = preArray[workerIndex];
}
}
System.arraycopy(tempArray, 0, preArray, 0, tempArray.length);
for (int i = 0; i < preArray.length; i++) {
System.out.println(preArray[i]);
}
}
return preArray[worker - 1];
}
}