当前位置: 首页 > article >正文

算法打卡 Day43(动态规划)-背包问题 + 分割等和子集

文章目录

  • 0-1 背包问题理论基础
  • 0-1 背包问题滚动数组
  • Leetcode 416-分割等和子集
    • 题目描述
    • 解题思路

0-1 背包问题理论基础

0-1 背包一般的题目要求是给定不同重量不同价值的物品,每个物品只有一个,已知背包中最大的负重,求在此限制条件下背包中的最大价值。

dp[i][j]表示表示重量为[0,i]的背包任取放入容量为 j 的背包中,对于每个物品,我们可以讨论放与不放物品 i 的情况,如果放物品 i,则当前价值为 dp[i-1][j],如果放物品 i,则价值为 dp[i-1][j-weight[i]]+value[i]

0-1 背包问题滚动数组

可以将上一标题下的二维 dp 数组进行压缩,对于背包重量为 j 的情况,直接原位对上一行进行修改,就能压缩为一维数组。这样递推公式变为 dp[j] = max(dp[j-1], dp[j-weight[i]]+value[i])。在遍历顺序上必须采用倒序遍历。

Leetcode 416-分割等和子集

题目描述

https://leetcode.cn/problems/partition-equal-subset-sum/description/

在这里插入图片描述

解题思路

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

http://www.kler.cn/news/366479.html

相关文章:

  • k8s 综合项目笔记
  • WPF+MVVM案例实战(六)- 自定义分页控件实现
  • 【javax maven项目缺少_Maven的依赖管理 引入依赖】
  • Python 从入门到实战39(线程间的通信)
  • Segugio:一款针对恶意软件的进程执行跟踪与安全分析工具
  • 聚类分析算法——DBSCAN(密度聚类)算法详解
  • 查看Chrome安装路
  • IDEA项目代码报红,但可以正常编译运行
  • #HarmonyOS:页面和自定义组件生命周期
  • 一站式AI自动化剪辑 内置多种功能 永久免费
  • UI自动化测试实战
  • 使用docker build自制flink镜像供k8s使用
  • 7. 配置
  • 用更多的钱买电脑而不是手机
  • 【pytest学习】pytest.main()
  • 数据库的CURD【MySql】
  • HttpContext模块 --- http上下文模块
  • 从零学习大模型(五)-----提示学习(Prompt Engineering)
  • 【C++融会贯通】多态
  • python爬虫实战案例——抓取B站视频,不同清晰度抓取,实现音视频合并,超详细!(内含完整代码)
  • 功能自动化测试工具Appium使用步骤讲解
  • 分类预测 | WOA-LightGBM基于鲸鱼算法优化轻量级梯度提升机算法数据分类预测Matlab程序
  • 安装OpenResty
  • Page Cache(页缓存)与脏页的关系
  • 安卓设备获取唯一id解决方案
  • rust:特征特征对象对象安全