背包问题
题目:
在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]
样例
样例 1:
输入: [3,4,8,5], backpack size=10
输出: 9
样例 2:
输入: [2,3,5,7], backpack size=12
输出: 12
解题思路:从最后一个物品开始思考,如果前n - 1个物品可以拼出m那么前n个物品必然可以拼出m,此时不需要装入最后一个物品;如果前n - 1个物品不能拼出m,那么装入最后一个物品判断是否可以拼出m。同样,判断第n - 1个物品是否可以拼出m - A[n - 1]的重量分别考虑装入和不装入情况,以此类推
public class Solution {
/**
* @param m: An integer m denotes the size of a backpack
* @param A: Given n items with size A[i]
* @return: The maximum size
*/
public int backPack(int m, int[] A) {
int len = A.length;
if(len == 0)
return 0;
//数组定义: dp[i][j]表示装入前i个物品拼出j重量是否可行
boolean dp[][] = new boolean[len + 1][m + 1];
//true可以拼出, false不可以
dp[0][0] = true;
/**
状态方程:dp[i][j] = dp[i - 1][j] || dp[i - 1][j - A[i]]
**/
for(int i = 1; i <= len; i++) {
dp[i][0] = true;
for(int j = 0; j <= m; j++) {
dp[i][j] = dp[i - 1][j];
if(j >= A[i - 1])
dp[i][j] = dp[i - 1][j] || dp[i - 1][j - A[i - 1]];
}
}
int ans = 0;
for(int i = m; i >= 0; i--) {
if(dp[len][i]) {
ans = i;
break;
}
}
return ans;
}
}