版权声明:本文为博主原创文章,未经博主允许不得转载。 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的背包
可以分两种情况:
- 背包能容下第i个物品,则我们要看前i-1个物品是否能填满j-A(i),即f(i)(j)=f(i-1,j-A(i))
- 背包不能容下第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;
}