首页 > 其他分享 >01背包问题

01背包问题

时间:2024-05-08 19:45:04浏览次数:24  
标签:01 int 件物品 问题 商品 背包 体积 价值

有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。

第 i 件物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入格式

第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。

接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。

输出格式

输出一个整数,表示最大价值。

数据范围

0<N,V≤1000

0<vi,wi≤1000

输入样例

4 5
1 2
2 4
3 4
4 5

输出样例:

8

题解:

每个物品都有两种情况, 选或者不选, 所以要从 2^n 中方案中找到最大值

f[i][j] 表示的是 只考虑前i个商品中, 体积不超过j的 最大价值
状态表示: 只考虑前i个商品中, 体积不超过j的价值
属性是: 最大值


状态计算:
对于每个f[i][j]都包含两个状态

  1. 不选第 i 个商品的最大价值 ---> f[i - 1][j]
  2. 选第 i 个商品的最大价值 ---> f[i - 1][j - v[i]] + w[i]

对这两个表达式 求一个max就是f[i][j], f[n][m]就是答案


ac代码 + 样例图解模拟 (横着的是 j, 竖着的是 i)

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int n, m;
int v[N], w[N];
int f[N][N];

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i ++) cin >> v[i] >> w[i];
    
    for (int i = 1; i <= n; i ++)
        for (int j = 0; j <= m; j ++)
        {
            f[i][j] = f[i - 1][j];
            if (j >= v[i]) f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);
        } 
   
// 为什么当j>=v[i]的时候就可以装第i个物品了呢,j的意思是总体积不超过j,如果只是总体积大于v[i],但是背包剩余的体积小于v[i],肯定装不下v[i]啊
// 可能有同学有上面的疑惑, 这里解释一下, f[i][j]的状态计算的第二个 "选第 i 个商品的最大价值", 是只考虑存在 第 i 个商品, i前面的商品是否存在不考虑
// 比如下图紫色字体的位置。 如果 这里的判断条件是 背包剩余的体积不小于v[i], 那么 图中紫色数字应该是2, 因为 v[1] = 1, v[2] = 2, j = 2, 前两个商品的体积加起来大于j(2)。 
// 但如果判断条件是(j >= v[i]) 紫色数字就是4, 因为第二个商品的价值是4, 显然, f[2][2] = 4才是对的

    cout << f[n][m] << endl;
    return 0;
}

觉得写的不错的话, 点个赞吧~

标签:01,int,件物品,问题,商品,背包,体积,价值
From: https://www.cnblogs.com/xxctx/p/18179285

相关文章

  • [Cmake Qt]找不到文件ui_xx.h的问题?有关Qt工程的问题,看这篇文章就行了。
    前言最近在开发一个组件,但是这个东西是以dll的形式发布的界面库,所以在开发的时候就需要上层调用。如果你是很懂CMake的话,ui_xx.h的文件目录在$下然后除了有关这个ui_xx.h,还有一些别的可以简单聊聊的一、父子工程组织,或者说依赖关系在使用CMake进行开发的时候,一般可以有......
  • buuctf-pwn-ciscn_2019_c_1-ret2libc
    检查一下保护情况ida里选项2,3都没有什么重要的信息,直接看选项1发现栈溢出漏洞,不过程序对输入的字符串有一个异或加密,这里可以构造异或后的payload,利用程序来解密,或者可以直接在payload第一位加上'\x00',直接截断payload后面的异或操作用cyclic测一下溢出点,得到88找一下system......
  • Debian 系统 IP 和 DNS 配置, 解决 resolv.conf 文件导致的问题
    IP配置/etc/network/interfacesautoeth0ifaceeth0inetstaticaddressx.x.x.xnetmask255.255.255.0gatewayx.x.x.x#dns-nameservers没有用DNS配置修改文件/etc/systemd/resolved.confDNS=8.8.8.88.8.4.4重启systemd-resolvedsystemctlrestartsystemd-res......
  • leetCode 001.两数之和
    给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例1:输入:nums=[2,7,11,15],ta......
  • 银河麒麟V10——问题记录
    1.在桌面登录用户后无法进入桌面,又退回到登录页面。权限问题:切到后台ctrl+alt+F1,进入主目录,chown-R用户名:用户名.Xauthority如仍解决不了问题,查看~.xesession-error日志,借助日志解决问题,如出现privatesocketdirermissiondeniedchmod 777 /tmp,修改/tmp权限。2......
  • 解决Vue项目在IIS部署中路由不存在导致的404错误问题
    最近Vue项目部署到IIS时遇到了一个问题:当输入不存在的路由时,页面会报下图的404错误,这样会导致我们的信息暴露,非常不安全,解决这个问题也很简单,通过配置网站的url重写即可解决这个问题。参考文章:https://blog.csdn.net/qq_40323256/article/details/124384969解决方法:给IIS部署的......
  • [转]docker访问宿主机 host.docker.internal 域名不生效的问题
    原文地址:docker网络问题host.docker.internal不生效?-SegmentFault思否host.docker.internal是一个开发功能,只在DockerDesktop有效。你用的是DockerDesktop吗?(Linux下一般都不是)https://docs.docker.com/deskt...ThehosthasachangingIPaddress(ornoneif......
  • java.lang.NoSuchMethodError的不明崩溃问题
    1)java.lang.NoSuchMethodError的不明崩溃问题2)微信小游戏有可行的分析Mono内存的方法吗3)游戏运行中,从对象池里拿Item时动态设置物体锚点,导致DC成倍增加4)ScriptableBuildPipeline打包ScritptableObject报错这是第384篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA......
  • C++基础-如何引入第三方静态库、动态库或自定义库 摘自 https://blog.csdn.net/u01310
    C++无论是内置库还是第三方库,都需要自己手动进行查找、配置、引入等工作。本文即是帮助完成C++项目对于库、框架如何完成依赖引入达成可调用的目的,重点讲述开发工具VisualStudio中的操作静态库(.lib)静态库引入适用用于大部分无开源的第三方库,开发者不需要关心库的具体实现如何,......
  • Testing Egineer note:2024_5_8-day07-part01
    设计测试用例方法之白盒测试法(了解)白盒测试技术白盒测试(结构测试或者逻辑驱动测试)定义:白盒测试也叫透明盒测试,检查程序内部结构及路径一是否符合规格说明,二是否符合其代码规范。白盒测试常见方法:语句覆盖;判断覆盖(也称“分支覆盖”);条件覆盖;判断、条件覆盖;条件组合覆盖;路......