回溯算法之裝載問題(Java實現)

問題描述

用回溯法編寫一個遞歸程序解決以下裝載問題:
有 n 個集裝箱要裝上 2 艘載重分別爲 c1 和 c2的輪船,其中集裝箱 i 的
重量爲 wi(1≤ i ≤ n),且∑ 𝑤𝑖 ≤ 𝑐1 + 𝑐2 。
問是否有一個合理的裝載方案能夠將這 n 個集裝箱裝上這 2 艘輪船?若是有,請給出裝載方案。java

示例

當 n=3,c1=c2=50,且 w=[10,40,40]時,能夠將集裝箱 1 和 2 裝到第一艘輪船上,集裝箱3裝到第二艘輪船上;
若是 w=[20,40,40]時,沒法將這 3 個集裝箱都裝上輪船。code

Java代碼遞歸

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Load {
	
    public static int weight1;  //記錄第一艘船的載重能力
    public static int weight2;  //記錄第二艘船的載重能力
	
    public static int sum1 = 0,sum2 = 0;        //分別表明此時第一艘船的載重和全部集裝箱的總重量
    public static int[] arr;                    //記錄集裝箱的重量
    public static int n;                        //集裝箱的個數
    public static List<Integer> list = new ArrayList<Integer>(); //第一艘船的集裝箱的裝載的重量
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        arr = new int[n];
        weight1 = scanner.nextInt();
        weight2 = scanner.nextInt();
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
            sum2 += arr[i];
        }
        scanner.close();
        backtrack(0);
    }
    public static void backtrack(int i) {
        if(sum1 > weight1) {   // 如若超載,則回溯
            return;
        }
        if(i == n) {
            if(sum2 - sum1 < weight2) {      
                System.out.println(list);
            }
            return;
        }
        sum1 += arr[i];
        list.add(arr[i]);
        backtrack(i+1);
        sum1 -= arr[i];
        list.remove(list.size()-1);
        backtrack(i+1);
		
    }
}
相關文章
相關標籤/搜索