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

01背包问题

时间:2023-11-18 20:33:50浏览次数:36  
标签:01 int 件物品 代码 问题 背包 max 考虑

题目链接

Acwing 01背包问题

解题思路

  1. 处理输入
    输入 n, m,v[i], w[i] 等信息

  2. 算法核心
    动态规划的思想是通过计算当前的值,这个值能被后来使用,最后得到解

    • 属性:求最大价值
    • 状态表示:只考虑前 i 件物品时,体积为 j 的最大价值
    • 思路:
      只考虑前 i 件物品时,体积为 j 的最大价值,这个价值可以通过“只考虑前 i - 1 件物品时,体积为 j 的最大价值”这个量给求出来。求的方法是计算选上第 i 件物品不选上第 i 件物品的最大值。
    • 代码表示:
      s[i][j] = s[i - 1][j];
      if (j >= v[i]) s[i][j] = max(s[i][j], s[i - 1][j - v[i]] + w[i]);
    • 最后取值:根据状态表示来决定,将 n 和 m 代入理解即是:只考虑前 n 件物品时,体积为 m 的最大价值,正好就是题目的要求
  3. 代码

#include<iostream>
using namespace std;

const int N = 1010;
int v[N], w[N];
int s[N][N];
int n, m;

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> v[i] >> w[i];
    
    s[0][0] = 0;
    
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            s[i][j] = s[i - 1][j];
            if (j >= v[i]) {
                s[i][j] = max(s[i - 1][j], s[i - 1][j - v[i]] + w[i]);
            }
        }
    }
    
    cout << s[n][m] << endl;
    
    return 0;
}
  1. 注意事项
    1. 读入的 v[i] 和 w[i] 数组都是从 1 开始
    2. 注意这里因为所有的 s[i] 都被初始化为0,所以才可使用 s[n][m]

01背包问题的优化

因为每次求第 i 次的状态只要求第 i - 1 次的状态,所以我们考虑降低维度,少一个循环。这里直观的考虑是使用滚动数组来解决,但不必要,使用一维的数组就可以解决。

解决方法如下:

  • 直接把二维变为一维,在不影响原来代码的逻辑上,更改代码
  • 删掉 s[i][j] = s[i - 1][j];
  • 将状态转移方程直接改为一维:s[j] = max(s[j], s[j - v[i]] + w[i]);
  • 为了不影响逻辑,观察:在计算 s[j] 的时候,因为循环是从小到大的,其实 s[j - v[i]] 已经被计算过了,所以 s[j - v[i]] 已经是第 i 层的结果了,被更新过了。所以解决办法是:把循环从 m 到 0。又由于有if (j >= v[i])这个状态,所以,循环从 m 到 v[i] 即可。
  • 考虑最后的结果:如果最初所有s[i]都是0的话,那么结果就是最后一个值;如果不这样,那么就需要 s[0] = 0, 其余的 s[i] 都是 -INF。最后结果还需要求最大值。

代码:

#include<iostream>
using namespace std;

const int N = 1010;
int v[N], w[N];
int s[N];
int n, m;

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 = m; j >= v[i]; j--) {
                s[j] = max(s[j], s[j - v[i]] + w[i]);
        }
    }
    
    cout << s[m] << endl;
    
    return 0;
}

标签:01,int,件物品,代码,问题,背包,max,考虑
From: https://www.cnblogs.com/vLiion/p/17841010.html

相关文章

  • 01背包问题
    1.  二维表示1#include<bits/stdc++.h>2usingnamespacestd;34constintN=1010;5intn,m;//个数和背包容量6intv[N],w[N];//每个物品的体积和价值7intf[N][N];//表示状态89intmain()10{11cin>>n>>m;1213fo......
  • Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)
    ApacheShiro1.2.4反序列化漏洞(CVE-2016-4437)ApacheShiro是一款开源安全框架,提供身份认证、授权、密码学和会话管理。Shiro框架直观、易用,同时也提供健壮的安全性。ApacheShiro1.2.4以及以前部版本中,加密的用户信息序列号后存储在名为remember-me的Cookie中,攻击者开源使用Shi......
  • 问题“连接到 xxxxx 时发生错误。对等端的证书已被吊销。“的解决方案
    真的是到处是坑啊,惨痛教训,要记录以下。之前在阿里云上装的免费的ssl证书,这个星期要到期了,因为免费的证书不能续费使用。要么就得升级成收费的,要么就得重新申请免费的ssl证书。于是我就重新申请了一个证书绑定好域名,然后测试访问好像没啥问题。 直到今天我在外面打算用手机访......
  • 解决icloud邮箱ssl网络错误的一种,全局代理配置有问题
    SSL错误也可能是因为代理配置今天,折腾我的macbookpro2015,发现邮件功能不能使用。而且更新系统也不行,网络不畅。最后发现原因,平时我使用谷歌学术助手igg和谷歌浏览器,这掩盖了系统全局代理一直处于错误配置的状态。并且以前配置了全局代理。但是一年到期了,没有续费会员。导致我的mac......
  • nginx常见问题
    1、400badrequest错误的原因和解决办法配置nginx.conf相关设置如下.client_header_buffer_size16k;large_client_header_buffers464k;根据具体情况调整,一般适当调整值就可以。2、Nginx502BadGateway错误......
  • 001——第一个代码程序
    每个程序都必须包含红色的部分。//包含头文件#include<iostream>//main函数,程序从这里开始intmain(){  //在控制台输出HelloWorld!并且换行  std::cout<<"HelloWorld!\n";}     ......
  • Mysql解决主从慢同步问题(下)
    Mysql解决主从慢同步问题(下)原创  https://cloud.tencent.com/developer/article/1836131 三.解决办法参数关闭binlog日志可以减轻从库的负载配置文件添加如下,将不缓冲直接写入,从而加速性能sync_binlog=0innodb_flushloginnodb_flush_log_at_trx_commi=0......
  • 关于maven构建tomcat服务器一直启动不了的问题解决
    以往我都是创建maven项目后自己去配置web,再通过自己配置以下信息之后,配置tomcat。最终结果是始终报错 之后摸索发现,可以在maven项目配置前将以上“maven主路径,用户设置文件,本地仓库”信息确定好。 在弹出的页面设置好后,再创建maven项目便省时很多,tomcat配置后可以使用 ......
  • 开发中遇到的echarts常见问题
    柱状图legend不出现①没有配置legend中的data属性②data的name属性与series的name属性不同设置legend阴影       itemStyle:{               opacity:1,               shadowColor:"rgba(255,255,255,1)",     ......
  • 记录第一篇IEEE论文写作问题
    标题在标题中,所有名词、代词、形容词、动词、副词和从属连词均大写。除单位缩写和首字母缩略词外,其他小写的缩写均大写。冠词(a、an、the)、并列连词(and、but、for、or、nor)和大多数短介词都是小写的,除非它们是第一个或最后一个词。三个以上字母的介词(Before、From、Through、With、......