class Solution { public int[] packing(int n, int m, int[] a, int[][] bomm){ int[] max = new int[m]; //計算每一個bom最多裝幾個 for (int i = 0; i < m; i++){ int temp = Integer.MAX_VALUE; for (int j = 0; j < a.length; j++){ if (bomm[i][j] == 0){ continue; }else if (a[j] / bomm[i][j] < temp){ temp = a[j] / bomm[i][j]; } } max[i] = temp; } int length = a.length; int[] left = new int[length]; int[] record = new int[length]; int[] bestLeft = new int[length]; //記錄最佳剩餘 int[] bestRecord = new int[length]; //記錄最佳剩餘時,每種bom的個數 for (int i = 0; i < length; i++){ left[i] = a[i]; bestLeft[i] = a[i]; } dfs(max, left, 0, bomm, record, bestLeft, bestRecord); return bestRecord; } public void dfs(int[] max, int[] left, int iter, int[][] bomm, int[] record, int[] bestLeft, int[] bestRecord){ if (iter >= max.length){ if (best(left, bestLeft)){ makeCopy(bestLeft, left); makeCopy(bestRecord, record); return; }else { return; } } for (int i = 0; i <= max[iter]; i++){ if (enough(left, bomm[iter], i)){ record[iter] = i; update(left, bomm[iter], i); dfs(max, left, iter+1, bomm, record, bestLeft, bestRecord); restore(left, bomm[iter], i); }else { if (best(left, bestLeft)){ makeCopy(bestLeft, left); makeCopy(bestRecord, record); return; }else { return; } } } } public boolean enough(int[] left, int[] bom, int i){ for (int j = 0; j < left.length; j++){ if (left[j] < bom[j] * i){ return false; } } return true; } public void update(int[] left, int[] bom, int i){ for (int j = 0; j < left.length; j++){ left[j] -= bom[j] * i; } } public void restore(int[] left, int[] bom, int i){ for (int j = 0; j < left.length; j++){ left[j] += bom[j] * i; } } public boolean best(int[] left, int[] bestLeft){ if (leftKinds(left) < leftKinds(bestLeft)){ return true; } return false; } //記錄剩餘商品的種類 public int leftKinds(int[] left){ int lKinds = 0; int length = left.length; for (int j = 0; j < length; j++){ if (left[j] != 0){ lKinds ++; } } return lKinds; } public void makeCopy(int[] a, int[] b) { int len = a.length; for (int i = 0; i < len; i++) { a[i] = b[i]; } } public static void main(String[] args){ Solution solution = new Solution(); // {2,3,1},商品組合bom1{2,1,1},bom2{1,1,0},bom3{0,1,1} int n = 3; int m = 3; int[] a = {2, 3, 1}; int[][] nums = new int[][]{ {2, 1, 1}, {1, 1, 0}, {0, 1, 1}}; System.out.println(Arrays.toString(solution.packing(n, m, a, nums))); } }