算法笔记|Day31动态规划IV
☆☆☆☆☆leetcode 1049.最后一块石头的重量II
题目链接:leetcode 1049.最后一块石头的重量II
题目分析
此题可以将stones分成两个总和最接近的两个部分,作差即为求得的最小值。若想使两部分最接近,第一部分的总和的目标应设置为target=sum/2,其中sum为集合中各个元素的和。这样可以得到的第一部分最大的总和为dp[target],第二部分的总和为sum-dp[target],差为(sum-dp[target])-dp[target]=sum-dp[target]*2。(注意点dp[target]总是小于target,而target小于等于sum/2)
1.dp数组含义:dp[j]表示总重量不超过j的几个数和的最大值(相当于0-1背包问题中的容量为j的背包最大的价值总和);
2.递推公式:dp[j]=Math.max(dp[j],dp[j-stones[i]]+stones[i])(相当于集合中每个元素的weight和value相同,都是数值stones);
3.初始化:dp[0]=0;
4.遍历顺序:先遍历stones嵌套遍历背包,背包一定是要倒序遍历。
代码
class Solution {
public int lastStoneWeightII(int[] stones) {
int sum=0;
for(int stone:stones)
sum+=stone;
int target=sum/2;
int dp[]=new int[target+1];
for(int i=0;i<stones.length;i++){
for(int j=target;j>=stones[i