首页 > 其他分享 >0-1背包问题 初理解

0-1背包问题 初理解

时间:2024-01-20 11:48:27浏览次数:31  
标签:背包 num int 最大值 问题 理解 物品 dp


第一次做这题确实没什么思路,看了卡哥的视频也是似懂非懂,现在整理一下。

首先明确变量有哪些,物品种类,单个物品重量,单个物品价值,背包的最大容量容量;这些变量该如何融入递推公式中呢?
先明确题目所求的是什么,在背包容纳范围下的价值最大。
为了求容量空间为N的价值最大,可以推想容量空间为1,为2该怎么求?
单个物品重量,单个物品价值其实是包含在物品种类这个变量中的。
综合所有变量,我们可以确定dp[i][j]。i就是表示物品种类,j就是背包最大容量。
这二维dp数组就像之前leetcode所有路径那道题了。
先初识化,确定第一行,第一列。
再确定递推公式,
// 如果装不下这个物品,那么就继承dp[i - 1][j]的值
// 如果能装下,就将值更新为 不装这个物品的最大值 和 装这个物品的最大值 中的 最大值
// 装这个物品的最大值由容量为j - weight[i]的包任意放入序号为[0, i - 1]的最大值 + 该物品的价值构成

点击查看代码
if (j < spa[i]) dp[i][j] = dp[i - 1][j];
       else{
            int num1=dp[i-1][j];
        int num2=dp[i-1][j-spa[i]]+val[i];
        dp[i][j]=max(num1,num2);}
    }

卡哥强调了这个遍历顺序,这道题先遍历背包或先遍历物品都可以。可以画出这图看清楚。

当前的值要么从上方来,要么从左上角来,两种遍历画图可知这几个地方都有值,因此都可以。

完整代码:

点击查看代码
#include<iostream>
#include<vector>
using namespace std;

int main(){
    int kind;int space;
    cin>>kind>>space;
    vector<int>spa;
    vector<int>val;
    for(int i=0;i<kind;i++){
        int num;
        cin>>num;
        spa.push_back(num);
    }
    for(int i=0;i<kind;i++){
        int num;
        cin>>num;
        val.push_back(num);
    }
  
vector<vector<int>> dp(kind, vector<int>(space + 1, 0));

for(int j=spa[0];j<=space;j++){
    dp[0][j]=val[0];
} 

for(int i=1;i<kind;i++){
    for(int j=0;j<=space;j++){
        if (j < spa[i]) dp[i][j] = dp[i - 1][j];
       else{
            int num1=dp[i-1][j];
        int num2=dp[i-1][j-spa[i]]+val[i];
        dp[i][j]=max(num1,num2);}
    }
   
}
cout<<dp[kind-1][space];
    return 0;
}

标签:背包,num,int,最大值,问题,理解,物品,dp
From: https://www.cnblogs.com/yun-che/p/17976199

相关文章

  • 简单课程安排问题
    问题描述:假定某大学有门课程需要使用同一个教室来上课。显然,我们不能在一个教室同时上两门或多门课程。因此,每门课使用教室的方式是独享的。假定这n门课程的集合为C={c1,c2,...,cn}。每门课使用教室的时间为{si,fi},i=1,2,...,n。这里si=开始时间,fi=结束时间。假设我们的目标是容纳......
  • 汉诺塔问题
    四阶汉诺塔求解图:汉诺塔问题代码实现以及当n=5,10,15,20增大时,算法所用时间长短变化情况图像绘制:1importtime2importmatplotlib.pyplotasplt34defhanoi(n,source,target,auxiliary):5ifn>0:6#将n-1个盘子从源柱子移动到辅助柱子7hanoi(n-1,......
  • 使用最小花费爬楼梯 动态规划初理解
    该题是动态规划入门程度,但最开始做的时候还是无从下手。我觉得卡哥给的步骤很重要:确定dp数组(dptable)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组首先明确dp数组(dptable)以及下标的含义很重要,最开始做这道题的时候,设了dp但不知道是代表什么。......
  • openeuler2203升级openssh9.4p1解决漏洞问题
    openeuler2203升级openssh9.4p1解决漏洞问题 1,使用rpmbuild将tar包打成rpm包,不喜欢编译升级的,使用RPM升级就方便多了。想使用openssh的源码包编译安装的,参考这里:OpenSSH-9.4p1(linuxfromscratch.org) 2,准备编译环境[root@centos7-31~]#  yuminstallrpm-buildzlib......
  • Visual Studio + QT环境 界面中文乱码问题及解决
    情况:  头文件开头加入预编译语句#pragmaexecution_character_set("utf-8") 效果:  参考:VS2019+qt解决中文乱码问题  ......
  • 解决 Ant TreeSelect(树选择)组件可以使用键盘选中 disabled(已禁用)项的问题
    最近在使用AntDesignVue(V3.2.20)的TreeSelect组件时发现一个问题:tree-data中部分数据的disabled属性设置为了true,选项是“禁用”状态,无法通过鼠标点击选中,但是可以通过键盘↑↓键切换选项,按下Enter键选中。一开始还以为是bug,后来通过查阅文档和测试发现,该组件还......
  • 吴师兄学算法day08 贪心 605. 种花问题
    题目:605.种花问题易错点:没想出来,借鉴了灵山的代码的思路,强行种花。我喜欢这个思路。感觉有点像设置哨兵那样的。 我的代码:classSolution:defcanPlaceFlowers(self,flowerbed:List[int],n:int)->bool:#修改数组,每次都种花,#凑够3个0......
  • 使用Nuxt框架刷新页面向后端接口请求两次的问题
    背景:当我刷新页面时,发现后端接口被请求了两次前端使用框架:nuxt、vue、axios等后端使用框架:springboot、maven、redis、mybatisplus等主页面程序代码<script>importhomePagefrom'@/api/homePage'exportdefault{data(){return{bannerList:[],//轮播......
  • 重复spin问题
    ROS2重复spin问题报错描述:在执行回调函数时,报错terminatecalledafterthrowinganinstanceof'std::runtime_error'what():Node'/workflow_control_node'hasalreadybeenaddedtoanexecutor.[ros2run]:Aborted;原因在回调函数中又执行了rclcpp::spin监听函......
  • /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found问题解决
    有一个go实现的项目代码最近有更新,自己在开发环境上手动构建并运行都没有问题(构建和运行时相同环境,肯定没有问题^_^)。后面通过jenkins构建镜像也没有问题,运行时却报错 之前的版本在jenkins上构建也是成功的,后沟通得知jenkins集群版本最近有更新 那么,大概知道原因了,由于jenk......