题目来源:牛客
01背包是一道很典型的二维数组动态规划问题
动态规划的关键就是把状态转移方程写好,该题dp[n][V]代表前n件物体在背包容量为V时可以装的最大容量
dp[i][j]有两种可能,第一种就是第i个物体可以放进容量为j的背包中
dp[i][j] = Math.max(dp[i-1][j-Vi]+Wi,dp[i-1][j]) 可以选择放i或者不放i,取最大值
第二种情况就是第i个物体放不进容量为j的背包中
dp[i][j] = dp[i-1][j]
动态规划不要忘记边界条件:
dp[i][0]=0 dp[0][j]=0
最后的答案就是dp[n][V]代码如下
public int knapsack (int V, int n, int[][] vw) {
// write code here
int[][] dp = new int[n+1][V+1]; //这里要清楚边界条件,防止-1以后超界
for(int i=1;i<=n;i++) {
for(int j=1;j<=V;j++) {
if(vw[i-1][0]>j) {
dp[i][j] = dp[i-1][j];
}else {
dp[i][j]=Math.max(dp[i-1][j-vw[i-1][0]]+vw[i-1][1],dp[i-1][j]);
}
}
}
return dp[n][V];
}