有一个国家发现了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];
}
}