lintcode背包问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kswkly/article/details/83546231

题目:
在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]
样例:
如果有4个物品[2, 3, 5, 7]
如果背包的大小为11,可以选择[2, 3, 5]装入背包,最多可以装满10的空间。
如果背包的大小为12,可以选择[2, 3, 7]装入背包,最多可以装满12的空间。
函数需要返回最多能装满的空间大小。
解析:
动态规划问题,关键在构建状态转移方程
令f(i)(j)表示 :前i个物品,是否能填满容量为j的背包
可以分两种情况:

  1. 背包能容下第i个物品,则我们要看前i-1个物品是否能填满j-A(i),即f(i)(j)=f(i-1,j-A(i))
  2. 背包不能容下第i个物品,则我们要看前i-1个物品是否能填满j,即f(i)(j)=f(i-1)(j)

代码:

public int backPack(int m, int[] A) {
        // write your code here
        if(A == null || A.length == 0 || m <= 0)
            return 0;
 
        int n = A.length;
 
        boolean[][] dp = new boolean[n + 1][m + 1];
        dp[0][0] = true;
 
        for(int i = 1; i <= n; i++){
            for(int j = 0; j <= m; j++){
                if(j >= A[i - 1] && dp[i - 1][j - A[i - 1]])
                    dp[i][j] = true;
                else if(dp[i - 1][j])
                    dp[i][j] = true;
            }
        }
 
        for(int i = m; i >= 0; i--)
            if(dp[n][i])
                return i;
 
        return 0;
    }

猜你喜欢

转载自blog.csdn.net/kswkly/article/details/83546231