代码随想录算法训练营第四十三天|1049.最后一块石头的重量II、494.目标和

1049.最后一块石头的重量II

public class Solution {
    public int LastStoneWeightII(int[] stones) {
        int sum=0;
        for(int i=0;i=stones[i];j--)
            {
                dp[j]=Math.Max(dp[j],dp[j-stones[i]]+stones[i]);
            }
        }
        return sum-dp[target]-dp[target];
    }
}

明确是一道动态规划题目,也是背包问题,每个数只能使用一次所以是01背包问题,稍加改造可得出状态转移方程Dp[j]=Math.Max(Dp[j],Dp[j-stones[i]]+stones[j])内层循环依旧是倒序处理。要想使得最后的石头重量最小,那就要将数组分成两堆,并且两堆总和差值越小越好,所以将Target设定大小为数组总和Sum的一半,最终返回结果即可。

494.目标和

public class Solution {
    public int FindTargetSumWays(int[] nums, int target) {
    int sum=0;
    int x=0;
    for(int i=0;isum))
    return 0;
    for(int i=0;i=nums[i];j--)
        {
            dp[j]+=dp[j-nums[i]];
        }
    }
    return dp[x];
    }
}

这道题也是01背包问题,不过需要找出关系式子,Left+Right=Sum,Left-Right=Target,Left=(Sum+Target)/2,根据推到,初始化Dp[0]=1,只要搞到Nums[i],凑成Dp[j]就有Dp[j - nums[i]] 种方法,所以状态转移方程为Dp[j]+=Dp[j-nums[i]],还需要进行剪枝处理,如果Target比Sum大则直接返回,如果Target+Sum是奇数也不行,最终返回Dp[x],X则是Left部分。

你可能感兴趣的:(算法,leetcode,c#,动态规划)