動態規劃-挖礦

有一個國家發現了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];
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章