用回溯法編寫一個遞歸程序解決以下裝載問題:
有 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); } }