代码随想录第四十二天|背包问题-二维dp、背包问题-一维dp、Leetcode416. 分割等和子集

news/2024/7/24 10:24:23 标签: leetcode, 算法, 动态规划

代码随想录第四十二天|背包问题-二维dp、背包问题-一维dp、Leetcode416. 分割等和子集

  • 背包问题-二维dp
  • 背包问题-一维dp
  • Leetcode416. 分割等和子集

背包问题-二维dp

文章链接:背包问题-二维dp
所谓背包问题,最基础的是01背包,前提是背包容量有限,每个物品有自己的价值重量放/不放 就组成了问题的 0/1
在这里插入图片描述
对于背包问题,有一种写法, 是使用二维数组,即dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少
递推公式方面,可以通过两个情况来得到dp[i][j]

  1. 不放物品i:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]
  2. 放物品i:由dp[i-1][j-weight[i]]推出,dp[i-1][j-weight[i]]为背包容量为j-weight[i]的时候不放物品i的最大价值,那么dp[i-1][j-weight[i]] + value[i](物品i的价值),就是背包放物品i得到的最大价值

写出来代码就是:

for(int i = 1; i < weight.size(); i++) { // 遍历物品
    for(int j = 0; j <= bagweight; j++) { // 遍历背包容量
        if (j < weight[i]) dp[i][j] = dp[i - 1][j];
        else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
    }
}

背包问题-一维dp

文章链接:背包问题-一维dp
为了背包问题特意开个二维数组,有点浪费空间,那么就缩为一维数组dp[j],更新的时候原地覆盖就可以了

dp[j]表示容量为j的背包能够装下的最高价值,

递推公式:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

遍历时顺序严格不可交换,因为物品i来了之后,要用到物品i-1的结果,所以有两大原则:

  1. 物品 i 在外层,背包容量 j 在内层,即先填满dp[j]
  2. 倒序遍历背包容量 j ,此举是为了防止前置位数据被覆盖,更新数据的时候用被覆盖过的数据就没意义了

写出来代码就是

for(int i = 0; i < weight.size(); i++) { // 遍历物品
    for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量
        dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); 
    }
}

Leetcode416. 分割等和子集

题目链接:Leetcode416. 分割等和子集
一个商品如果可以重复多次放入是完全背包,而只能放入一次是01背包,写法还是不一样的。要明确本题中我们要使用的是01背包,因为元素我们只能用一次。
这个用背包来做还是挺有难度的

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        vector<int> dp(10001,0);
        int sum=0,target=0;
        for(int i=0;i<nums.size();i++){
            sum+=nums[i];
        }
        if(sum%2==1) return false;
        target=sum/2;
        for(int i=0;i<nums.size();i++){
            for(int j=target;j>=nums[i];j--){
                dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]);
            }
        }
        return dp[target]==target;
    }
};

http://www.niftyadmin.cn/n/149181.html

相关文章

从0开始学python -56

Python3 多线程-1 多线程类似于同时执行多个不同程序&#xff0c;多线程运行有如下优点&#xff1a; 使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面可以更加吸引人&#xff0c;比如用户点击了一个按钮去触发某些事件的处理&#xff0c;可以弹出一个进度条…

centos7-达梦7数据库环境搭建

文章目录centos7-达梦7数据库环境搭建准备工作安装dm初始化数据库实例注册服务服务的启停、状态设置自动启动脚本生成自定义镜像centos7-达梦7数据库环境搭建 准备工作 拉取centos7镜像 docker pull centos:centos7docker images;REPOSITORY TAG IMAGE ID CREATED SIZE cent…

QML- import 导入JavaScript资源

import 导入JavaScript资源一、概述二、从QML文档导入JavaScript资源三、JavaScript资源中的导入四、从另一个JavaScript资源中导入JavaScript资源五、从JavaScript资源中导入QML模块一、概述 JavaScript资源可以通过QML文档和其他JavaScript资源导入。JavaScript资源可以通过…

【虹科动态】虹科电子携手广师大于3月16日举办行业就业论坛暨高科技峰会

为进一步加强校企联动&#xff0c;精准对接促就业&#xff0c;广东技术师范大学招生就业办公室携手广州虹科电子科技有限公司举办行业就业论坛及专场招聘。欢迎大家积极参与&#xff01; 专题论坛 时间&#xff1a;3月16日14:00-17:00 地点&#xff1a;广师大&#xff08;白…

阿里云国际站-阿里云在其云峰会上推出新的直播电子商务解决方案

阿里云国际站宣布推出20多种新产品&#xff0c;包括云操作系统升级和云原生数据库。 中国杭州&#xff0c;2021年6月8日——阿里巴巴集团的数字技术和智能骨干阿里云今天推出了新的一站式电子商务直播解决方案&#xff0c;以帮助全球各种规模的商家推出实时互动渠道&#xff0…

20230314 ax

AX平台模型转换说明&示例 该示例将介绍算法如何在爱芯芯片上编译、量化及运行 文件存储链接如下&#xff1a; SDK存储在了公司微盘 baiduwangpan ax量化使用说明文档&#xff1a;neuwizard_doc_release.zip ax官方示例网站&#xff1a;GitHub - AXERA-TECH/ax-samples: S…

上海亚商投顾:沪指震荡反弹涨1.2% 中国移动创历史新高

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪大小指数今日走势分化&#xff0c;沪指午后涨超1%&#xff0c;长阳反包上周五阴线&#xff0c;创业板指盘中则跌逾1%…

2. QtDesignerStudio创建组件,添加信号,自定义属性和属性绑定

1. 组件创建 在 Qt Design Studio 中创建组件有两种方式&#xff0c;一种是直接在Components窗口中将想要添加的控件拖拽到Navigator窗口或者2D界面内&#xff0c;一种是在Code窗口直接使用代码进行添加。 1.1 拖拽方式添加&#xff1a; 在界面设计窗口的左侧&#xff0c;一…