代码随想录算法训练营Day-36动态规划04 | 1049. 最后一块石头的重量 II、494. 目标和、474.一和零

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

向背包问题的转化方式:

根据题意,最终的结果就是把石头分成最接近的两堆,然后做差。所以转化为背包问题就是,往容器为sum/2的背包里面放最大重量的石头,也就是把石头价值设为重量。最终dpsum/2的值就是分成的两堆中比较小的堆重 ,然后sum-dpsum/2就是比较大的堆重,二者做差就是最终结果。

cpp 复制代码
class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
        vector<int> dp(15001,0);
        int sum=0;
        for(int i:stones) sum+=i;
        int target = sum/2;
        for(int i=0;i<stones.size();++i){
            for(int j=target;j>=stones[i];--j){
                dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);
            }
        }

        return sum-dp[target]-dp[target];
    }
};

494. 目标和

转化成背包问题的思路:

本题可化为划分两个子集的问题,left为加号集总和,right为减号集总和,求其中一个集合的放物品方式即可得到结果(因为一个集合固定了,另外一个集合也是固定的);

两个公式:left+right=sum;left-right=target;

推导出:left=(sum+target)/2;

所以left可作为背包的最大容量,然后nums中的元素即为物品,转化为了背包问题

动规五部曲-一维:

1.dpj的含义:容量为j的背包,在i个物品下选取,装满背包有多少种方式

2.递推公式:dpj+=dpj-nums\[i]

解释:dpj 的含义是前 i-1 个物品装满容量 j 的方式数量;dpj-nums\[i] 是前 i-1 个物品装满容量 j-numsi 的方式数量。把dpj拆分为两种情况

(1) 选择当前物品 numsi ,那么这些能够装满 j-numsi 的方案,每一种都可以再加上当前物品,变成一种装满容量 j 的新方案。所以当前 dpj 需要加上 dpj-nums\[i] 这一部分。

(2) 不选择当前物品numsi,前面物品已经能够装满 j 的方案数-dpj(上一循环的)

因此最终 dpj 就等于"不选当前物品的就能装满j的方案数"加上"选择当前物品能装满j的方案数"。

3.初始化方式:只需dp0=1,其余为0,方便后面容量进行递推,例:有一个数字1,容量为1,所以有一种方法,按照递推公式dp1+=dp0,所以需要dp0=1,否则dp所有元素都是0了。

4.遍历顺序:和0-1背包问题一样,为了避免重复选取物品和能够放入多个物品,需要先物品后背包+倒序遍历

cpp 复制代码
class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {
        int sum = 0;
        for(int i:nums) sum+=i;
        if (abs(target) > sum) return 0;
        if((sum+target) % 2 !=0) return 0;
        int rongliang = (sum+target)/2;

        vector<int> dp(rongliang+1,0);
        dp[0]=1;

        for(int i=0;i<nums.size();i++){
            for(int j=rongliang;j>=nums[i];j--){
                dp[j] += dp[j-nums[i]];
            }
        }

        return dp[rongliang];
    }
};

474.一和零


相关推荐
GreenTea1 小时前
vLLM 与 SGLang KV Cache 底层实现机制深度调研报告
前端·后端·算法
Bode_20022 小时前
多资源规划(含生产调度、库存管理及产能规划)的创新优化算法
算法·调度
土司大王2 小时前
LeetCode hot100——35.搜索插入位置:Java 二分模板、左闭右开区间与插入点分析
java·算法·leetcode
微三云生态系统架构师-彭丹3 小时前
远方好物S2B2C系统架构:一级分销与保证金托管的合规技术实现
人工智能·算法
土司大王3 小时前
LeetCode hot100——34.在排序数组中查找元素的第一个和最后一个位置:Java 二分模板、边界分析
java·算法·leetcode
罗西的思考4 小时前
机器人模型(WM / WAM / VLA)综合分析与对比:从「看」到「想」再到「做」
人工智能·算法·机器学习
Logic1015 小时前
C语言/数据动态规划题解:翻转一次子数组后的最大子数组和——四状态DP(O(n)时间O(1)空间)
c语言·数据结构·动态规划·时间复杂度·算法题·状态机dp·最大子数组和
小哈里5 小时前
【知识】从学科到实践:自然・工程・社科・人文|算法・研发・产品・品牌设计
程序人生·算法·产品·设计·工程
小π军6 小时前
最大重叠区间数量
数据结构·算法
镜像视界(浙江)科技有限公司6 小时前
《视频孪生之上:二维展示终结,三维空间计算重构城市逻辑》——跨摄像连续表达 × 三角测量厘米级定位 × 动态轨迹建模,构建新一代城市空间
大数据·人工智能·算法·矩阵·音视频·空间计算