Backpack

Given n items with size Ai, an integer m denotes the size of a backpack. How full you can fill this backpack?

这一个题不是背包9讲里面的例子,但是是01完全背包的变形,只考虑体积和背包体积,不考虑价值.后面一个是空间没有优化的做法,但是因为可以空间优化,至于i-1的元素有关,然后又是每个元素只能用一次,所以要倒叙(方法一)

方法一:空间优化

     public int backPack(int m, int[] A) {
        boolean f[] = new boolean[m + 1];

            for (int j = 0; j <= m; j++) {
                f[j] = false;
            }

        f[0] = true;
        for (int i = 1; i <= A.length; i++) {
            for (int j = m; j >= 0; j--) {

                if (j >= A[i-1] && f[j - A[i-1]]) {
                    f[j] = true;
                }
            } // for j
        } // for i


        for (int i = m; i >= 0; i--) {
            if (f[i]) {
                return i;
            }
        }

        return 0;
    }
     public int backPack(int m, int[] A) {
        boolean f[][] = new boolean[A.length + 1][m + 1];
        for (int i = 0; i <= A.length; i++) {
            for (int j = 0; j <= m; j++) {
                f[i][j] = false;
            }
        }
        f[0][0] = true;
        for (int i = 1; i <= A.length; i++) {
            for (int j = 0; j <= m; j++) {
                f[i][j] = f[i - 1][j];
                if (j >= A[i-1] && f[i-1][j - A[i-1]]) {
                    f[i][j] = true;
                }
            } // for j
        } // for i


        for (int i = m; i >= 0; i--) {
            if (f[A.length][i]) {
                return i;
            }
        }

        return 0;
    }

results matching ""

    No results matching ""