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

代码随想录算法训练营Day35

第九章 动态规划part03

正式开始背包问题,背包问题还是挺难的,虽然大家可能看了很多背包问题模板代码,感觉挺简单,但基本理解的都不够深入。

如果是直接从来没听过背包问题,可以先看文字讲解慢慢了解 这是干什么的。

如果做过背包类问题,可以先看视频,很多内容,是自己平时没有考虑到位的。

背包问题,力扣上没有原题,大家先了解理论,今天就安排一道具体题目。

详细布置

01背包问题 二维

代码随想录

视频讲解:带你学透0-1背包问题!| 关于背包问题,你不清楚的地方,这里都讲了!| 动态规划经典问题 | 数据结构与算法_哔哩哔哩_bilibili

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, bagweight;// bagweight代表行李箱空间

    cin >> n >> bagweight;

    vector<int> weight(n, 0); // 存储每件物品所占空间
    vector<int> value(n, 0);  // 存储每件物品价值

    for(int i = 0; i < n; ++i) {
        cin >> weight[i];
    }
    for(int j = 0; j < n; ++j) {
        cin >> value[j];
    }
    // dp数组, dp[i][j]代表行李箱空间为j的情况下,从下标为[0, i]的物品里面任意取,能达到的最大价值
    vector<vector<int>> dp(weight.size(), vector<int>(bagweight + 1, 0));

    // 初始化, 因为需要用到dp[i - 1]的值
    // j < weight[0]已在上方被初始化为0
    // j >= weight[0]的值就初始化为value[0]
    for (int j = weight[0]; j <= bagweight; j++) {
        dp[0][j] = value[0];
    }

    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]; // 如果装不下这个物品,那么就继承dp[i - 1][j]的值
            else {
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
            }
        }
    }
    cout << dp[n - 1][bagweight] << endl;

    return 0;
}

01背包问题 一维

代码随想录

视频讲解:带你学透01背包问题(滚动数组篇) | 从此对背包问题不再迷茫!_哔哩哔哩_bilibili

#include<iostream>
#include<vector>
using namespace std;

int main()
{
    int kind,space;
    cin>>kind>>space;
    vector<int> sp(kind,0);
    vector<int> value(kind,0);
    vector<int> dp(space+1,0);
    for(int i=0;i<kind;i++) cin>>sp[i];
    for(int i=0;i<kind;i++) cin>>value[i];
    
    for(int i=0;i<kind;i++){
        for(int j=space;j>=sp[i];j--){
            dp[j]=max(dp[j],dp[j-sp[i]]+value[i]);
        }
    }
    
    cout<<dp[space];
    
    return 0;
}

416. 分割等和子集

本题是 01背包的应用类题目

代码随想录

视频讲解:动态规划之背包问题,这个包能装满吗?| LeetCode:416.分割等和子集_哔哩哔哩_bilibili

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


http://www.kler.cn/a/531109.html

相关文章:

  • 深度学习-98-大语言模型LLM之基于langchain的代理create_react_agent工具
  • 使用 PyTorch 实现逻辑回归并评估模型性能
  • 知识库建设与知识管理实践对企业发展的助推作用探索
  • potplayer字幕
  • pytorch实现简单的情感分析算法
  • Linux网络 HTTPS 协议原理
  • Docker 部署教程jenkins
  • 1-刷力扣问题记录
  • 学习并熟练使用MyBatis
  • Unity打包安卓报错sdk version 0.0 < 26.0(亲测解决)
  • 深度解读 Docker Swarm
  • OpenAI 实战进阶教程 - 第七节: 与数据库集成 - 生成 SQL 查询与优化
  • 98.2 AI量化开发:基于DeepSeek打造个人专属金融消息面-AI量化分析师(理论+全套Python代码)
  • I.MX6ULL 中断介绍下
  • 【linux学习指南】线程概念与控制
  • 【大数据技术】教程03:本机PyCharm远程连接虚拟机Python
  • 玩转ChatGPT:DeepSeek测评(科研思路梳理)
  • Codeforces Round 981 (Div. 3)
  • 【模块化编程关键字】C语言模块化编程关键技术及其应用研究
  • 机试题——到邻国目标城市的最短距离
  • 基于单片机的智能感控杆设计(论文+源码)
  • 【电路笔记】-计数器与分频
  • Tree Compass( Codeforces Round 934 (Div. 2) )
  • 如何生成强密码:提高网络安全性的全面指南
  • 【C语言入门】解锁核心关键字的终极奥秘与实战应用(三)
  • win32汇编环境,窗口程序中使用进度条控件