动态规划-挖矿

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