动态规划01背包问题系列一>最后一块石头的重量II
这里写目录标题
- 题目分析:
- 状态表示:
- 状态转移方程:
- 初始化:
- 填表顺序:
- 返回值:
- 代码呈现:
- 优化版本:
- 代码呈现:
题目分析:
状态表示:
状态转移方程:
初始化:
填表顺序:
返回值:
返回最小质量的石头
代码呈现:
class Solution {
public int lastStoneWeightII(int[] stones) {
int n = stones.length;
int sum = 0;
for(int i = 0; i < n; i++) sum += stones[i];
int aim = sum/2;
int[][] dp = new int[n+1][aim+1];
for(int i = 1; i <= n; i++)
for(int j = 0; j <= aim; j++){
dp[i][j] = dp[i-1][j];
if(j >= stones[i-1])
dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-stones[i-1]] + stones[i-1]);
}
return sum - 2 * dp[n][aim];
}
}
优化版本:
不知道怎么优化看前面:链接: 点击
代码呈现:
//空间优化:
int n = stones.length;
int sum = 0;
for(int i = 0; i < n; i++) sum += stones[i];
int aim = sum/2;
int[] dp = new int[aim+1];
for(int i = 1; i <= n; i++)
for(int j = aim; j >= stones[i-1]; j--){
dp[j] = Math.max(dp[j],dp[j-stones[i-1]] + stones[i-1]);
}
return sum - 2 * dp[aim];