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

01背包问题总结

文章目录

  • 概要
  • 一、正确的01背包代码(一维)
    • 1.代码
    • 2.正确结果
  • 二、先遍历重量,再遍历物品的01背包问题(错误的错误的错误的,重要的事情说三遍!!!)
    • 1.错误代码
    • 2.错误试验结果
    • 3.结果分析
  • 三、小结

概要

在刷代码随想录的时候,我看到了在一维状态下,i和j的顺序是不能颠倒的,如果颠倒的话,会导致每次只有一个物体放入背包,我其实不是很懂为什么,但是又很爱钻牛角尖,于是自己试验了一下。(不是为了带偏各位,只是发表一下自己的小小的想法,所以我会先给出正确的代码)
我实验的数据如下
实验的数据

一、正确的01背包代码(一维)

1.代码

#include <iostream>
#include <vector>using namespace std;int main()
{int m, n;cin >> m >> n;vector<int> weight(m, 0), value(m, 0);for (int i = 0; i < m; i++) cin >> weight[i];for (int i = 0; i < m; i++) cin >> value[i];vector<int> dp(n + 1, 0);for (int i = 0; i < m; i++){for (int j = n; j >= weight[i]; j--){if (j >= weight[i]) dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);cout << dp[j] << " ";}cout << endl;}return 0;
}

2.正确结果

01背包一维正确结果

二、先遍历重量,再遍历物品的01背包问题(错误的错误的错误的,重要的事情说三遍!!!)

1.错误代码

可以看到在循环的部分,我将dp[i]作为了存储结果的部分。

#include <iostream>
#include <vector>using namespace std;int main()
{int m, n;cin >> m >> n;vector<int> weight(m, 0), value(m, 0);for (int i = 0; i < m; i++) cin >> weight[i];for (int i = 0; i < m; i++) cin >> value[i];vector<int> dp(n + 1, 0);for (int i = n; i >= 0; i--){for (int j = 0; j < m; j++){if (i >= weight[j]) dp[i] = max(dp[i], dp[i - weight[j]] + value[j]);cout << dp[i] << " ";}cout << endl;}return 0;
}

2.错误试验结果

错误试验结果

3.结果分析

这个结果分析和我之前发的那个完全背包的不同,我直接就能看到最后的结果,当我从n开始遍历,那为什么不从0开始遍历了,那就可以去看我的上一篇帖子了,因为从0开始遍历就会变成完全背包问题,我把我的分析结果发一下哈
分析结果
你会发现很大一段结果就只写了一小部分,但是这个代码就是这样的。

三、小结

这个帖子不算是为了总结,只是希望给看到代码随想录的一些朋友知道为什么卡哥说了那句话,如果给您带偏了,见谅见谅见谅!!!

http://www.dtcms.com/a/273328.html

相关文章:

  • 三维旋转沿轴分解
  • AWS ECS任务角色一致性检查与自动修复工具完全指南
  • LVGL学习笔记-----进度条控件(lv_bar)
  • Java结构型模式---桥接模式
  • 什么?不知道 MyBatisPlus 多数据源(动态数据源)干什么的,怎么使用,看这篇文章就够了。
  • AI探索 | 豆包智能助手跟扣子空间(AI办公助手)有什么区别
  • Ranger框架的发展历程
  • Windows系统DLL、运行库、DirectX等DLL丢失等异常状态
  • 数组的应用示例
  • 【Python进阶篇 面向对象程序设计(7) Python操作数据库】
  • 《测试开发:从技术角度提升测试效率与质量》
  • 《Revisiting Generative Replay for Class Incremental Object Detection》阅读笔记
  • 3D lidar目标跟踪
  • PyTorch自动微分:从基础到实战
  • Linux C 文件基本操作
  • 【Java并发编程】AQS(AbstractQueuedSynchronizer)抽象同步器核心原理
  • 飞算科技:以原创技术赋能电商企业数字化转型
  • AI翻唱——So-VITS-SVC
  • ubuntu virtual box全屏
  • 无人机三叶螺旋桨概述
  • kail相关
  • Linux下PCIe子系统(二)——PCIe子系统框架详解
  • 算法练习5-原地移除数组中所有的元素
  • 多元函数的链式法则:从单变量到高维的推广
  • 无人设备遥控器之无线电频率篇
  • Java HashMap已存在的值是否覆盖
  • 全链智造铸丰碑 全球布局启新程 —— 河北华创测控技术有限公司领航测控产业新高度
  • python学习打卡:DAY 29 复习日:类的装饰器
  • 快捷键——VsCode
  • msf复现“永恒之蓝”