一道笔试题

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)));
    }
}

 

posted on 2018-03-21 18:19  moonLY  阅读(174)  评论(0编辑  收藏  举报