首页 > 其他分享 >代码随想录day42 | 01背包问题二维 01背包问题一维 416. 分割等和子集

代码随想录day42 | 01背包问题二维 01背包问题一维 416. 分割等和子集

时间:2022-11-03 23:01:37浏览次数:75  
标签:vector 01 weight 复杂度 随想录 背包 物品 dp

01背包问题 二维

文章

思路

本题没有特定的题目。有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。

实现

  1. dp数组及其含义
    dp[i][j]表示背包的最大重量是j,可以从0-i中物品中任取物品。此时背包所装物品的最大价值为dp[i][j]
  2. 递推公式
  • 不放物品
    当不放入新物品时,总的最大价值没有变,仍然为dp[i-1][j]
  • 放物品
    当放入新物品时,需要先取出物品,再放入物品,因此价值为dp[i-1][j-weight[i]] + value[i]
  • 递推公式
    dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]] + value[i])
  1. 初始化
    当背包的重量为0时,背包中所装物品的价值一定为0;
    当背包中只有物品0时,如果背包的重量大于weight[0],那么背包的总价值为value[0]
    image

  2. 遍历顺序
    遍历过程所需要的时该位置左上角的元素,因此先便利物品还是先遍历背包都能得出正确结果。
    先物品后背包
    先背包后物品

点击查看代码
void test_2_wei_bag_problem1() {
    vector<int> weight = {1, 3, 4};
    vector<int> value = {15, 20, 30};
    int bagweight = 4;

    // 二维数组
    vector<vector<int>> dp(weight.size(), vector<int>(bagweight + 1, 0));

    // 初始化
    for (int j = weight[0]; j <= bagweight; j++) {
        dp[0][j] = value[0];
    }

    // weight数组的大小 就是物品个数
    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]);

        }
    }

    cout << dp[weight.size() - 1][bagweight] << endl;
}

int main() {
    test_2_wei_bag_problem1();
}

复杂度分析

  • 时间复杂度:O(n * m),m为物品种类,n为背包重量
  • 空间复杂度:O(n * m)

01背包问题 一维

文章

思路

  1. 数组及其下标含义
    dp[j]表示背包重量为j时,背包中物品的最大价值
  2. 递推公式
    dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
  3. 初始化
    当背包质量为0时,其中的价值一定为0;
    因此初始化时,初始化所有质量为0即可。
  4. 遍历顺序
    先重量再物品那么背包中只能装有一个物品,(会不断刷新背包中的物品)只能先物品再背包。
    因为递推中需要左上角的元素,因此,遍历背包需要倒序遍历。

实现

点击查看代码
void test_1_wei_bag_problem() {
    vector<int> weight = {1, 3, 4};
    vector<int> value = {15, 20, 30};
    int bagWeight = 4;

    // 初始化
    vector<int> dp(bagWeight + 1, 0);
    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]);
        }
    }
    cout << dp[bagWeight] << endl;
}

int main() {
    test_1_wei_bag_problem();
}

复杂度分析

  • 时间复杂度:O(m*n),m为物品种类,n为背包重量
  • 空间复杂度:O(n)

416. 分割等和子集

题目|文章
image

思路

dp[i]表示和为i时的最大子集。如果dp[i] == sum/2,说明可以分割

实现

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

        }
        if(dp[sum/2] == sum/2) return true;
        else return false;
    }
};

复杂度分析

  • 时间复杂度:O(n^2)
  • 空间复杂度:O(n)

标签:vector,01,weight,复杂度,随想录,背包,物品,dp
From: https://www.cnblogs.com/suodi/p/16856125.html

相关文章

  • js基础01
    ExerciseTest01严格检查模式strict'usestrict';//预防js的随意性导致产生的一些问题,必须放在第一行leti=1;//局部变量建议都用let定义数据类型数......
  • 01-分布式系统概述&大数据技术生态体系
    目录​​一,什么是分布式系统​​​​1,概念​​​​2,特点​​​​3,典型问题​​​​二,CAP定理​​​​1,C、A、P​​​​2,CAP定理​​​​三,BASE理论​​​​1,BA、S、EC​​​......
  • 20201318李兴昕第十二章学习笔记
    第十二章:块设备I/O和缓冲区管理知识点归纳总结:本章讨论了块设备I/O和缓冲区管理;解释了块设备I/O的原理和I/O缓冲的优点;论述了Unix的缓冲区管理算法,并指出了其不足之......
  • 解决Server2012r2 服务器 中文乱码
    已解决,解决方法如下:我在输入chcp936时报错invalidpagecode,就按此处理,需要的人可自取现象:命令行中中文字符显示为问号,输入chcp936会提示invlalidpagecode.解决......
  • Windows 10下基于Visual Studio 2019编译配置VTK 8.2.0
    参考:https://blog.csdn.net/weixin_42694889/article/details/1159645331、下载并安装VisualStudioCommunity2019、CMake3.19.0;2、下载VTK8.2.0并解压:https://vt......
  • 福建WC2014 路径权值(Kruskal重构树 + 树状数组)
    题目描述:给定一个带权树,树上任意两点间的路径权值\(d\left(x,y\right)\)定义为\(x,y\)这两个点之间路径上的最小值,树上任意一点x的权值定义为这个点到树上其他所有点......
  • 【毕业设计】工作日志01:开题答辩
    开题答辩一、答辩经过其实11月1日我才完成了开题报告的最终版本,11月2日晚上8点45就要答辩,所以我的PPT做得比较差,很多想做的内容没做,想写的细节没写上,光顾着用嘴巴讲......
  • luffy学习-01
    一、企业项目类型1、面向互联网用户:商城类项目微信小程序商城2、面向互联网用户:二手交易类咸鱼转转3、公司内部项目:Python写的重点-OA系统-打卡系统工资核算系......
  • 【408】2016
    t41窗口要加单位呀!在"传输"中,K是1000,不要引起歧义了四次握手中:1、连接释放报文段2、确认报文段3、连接释放报文段4、确认报文段三次握手中:1、连接请求报文段2、......
  • 代码随想录day41 | 343. 整数拆分 96. 不同的二叉搜索树
    343.整数拆分题目|文章思路一个动态规划问题最重要的就是找到递推公式,找到递推公式,整个题就已经解出来了。这道题看到时会想分成几份比较好,等于10时与之前的数有什么......