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

AcWing 2. 01背包问题

时间:2023-09-04 21:34:03浏览次数:41  
标签:01 int max -- 背包 体积 件物品 AcWing

JWvFczgRNg.jpg

题目

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

第 $i$ 件物品的体积是 $v_i$,价值是 $w_i$。

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

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

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

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

数据范围 $0<N,V≤1000$ $0<v_i,w_i≤1000$ 输入样例

4 5
1 2
2 4
3 4
4 5

输出样例:

8

思路

状态表示:从前i个物品取且体积不超过j的价值的最大值 状态属性:最大值 状态计算:

对于第i个物品,存在两个选择,取或者不取
不取:f[i][j] = f[i- 1][j]
取:f[i][j] = f[i - 1][j - v] + w 

通过以上思路两重循环遍历物品与体积,得到朴素算法。

接下来可以将数组优化成一维,部分代码如下

for (int i = 1; i <= n; i ++ )
{
    cin >> v >> w;
    for (int j = 0; j <= m; j ++ )  --> 1. for (int j = m; j >= v; j -- )
    {
        f[i][j] = max(f[i][j], f[i - 1][j]); --> 2. f[j] = max(f[j], f[j])
        
        if (j >= v)
            f[i][j] = max(f[i][j], f[i - 1][j - v] + w);  --> 3. f[j] = max(f[j], f[j - v] + w)
    }
}

关键的一点,为什么逆序遍历可以优化到一维? j - v < j 当我们优化到一维且正序遍历体积时,f[j - v] 优先被计算,后续再更新到 f[j] 时,此时的f[i][j] = max(f[i][j], f[i][j - v] + w),与预期的公式不符,而逆序遍历体积恰好能解决这个问题,使得计算 f[j] 时,f[j - v] 仍是 f[i - 1][j - v]

代码

1. 朴素算法

#include <iostream>

using namespace std;

const int N = 1010;

int n, m;
int v, w;
int f[N][N];

int main()
{
    cin >> n >> m;
    
    f[0][0] = 0;
    for (int i = 1; i <= n; i ++ )
    {
        cin >> v >> w;
        for (int j = 0; j <= m; j ++ )
        {
            f[i][j] = max(f[i][j], f[i - 1][j]);
            
            if (j >= v)
                f[i][j] = max(f[i][j], f[i - 1][j - v] + w);
        }
    }
    
    cout << f[n][m] << endl;
    
    return 0;
}

2. 优化成一维

#include <iostream>

using namespace std;

const int N = 1010;

int n, m;
int v, w;
int f[N];

int main()
{
    cin >> n >> m;
    
    for (int i = 1; i <= n; i ++ )
    {
        cin >> v >> w;
        for (int j = m; j >= v; j -- )
            f[j] = max(f[j], f[j - v] + w);
    }
    
    cout << f[m] << endl;
    
    return 0;
}

标签:01,int,max,--,背包,体积,件物品,AcWing
From: https://blog.51cto.com/u_16170343/7357354

相关文章

  • 整数分解方法——腾讯2017春招真题
    如下示例:1:共0种分解方法;2:共0种分解方法;3:3=2+1共1种分解方法;4:4=3+1=2+1+1共2种分解方法;5:5=4+1=3+2=3+1+1=2+2+1=2+1+1+1共5种分解方法6:6=5+1=4+2=4+1+1=3+2+1=3+1+1+1=2+2+1+1=2+1+1+1+1共7种分解方法以此类推,求一任意整数num有几种分解方法?思路:对于数num,按照分解......
  • vs2019快捷键注释不起作用
      使用:  再一次:Ctrl+/ 反注释。 ......
  • P2305 [NOI2014] 购票
    P2305[NOI2014]购票Solution记\(f_{i}\)表示\(i\)节点处的答案。\(f_1=0\)。记\(d_i\)表示根节点到点\(i\)的距离,容易得到\(O(n^2)\)的dp转移:\[f_{i}\xleftarrow{\min}f_j+(d_i-d_j)\timesp_i+q_i,d_i-d_j\lel_i\]设\(y=f_i-d_i\timesp_......
  • win2016系统php7.4安装oracle oci8扩展
    查看php版本,判断操作系统是否64位;phpinfo();判断PHP是否TS查看ThreadSafety的值,如果是disabled就是NTS,否则是TS,下载的时候要区分;下载扩展oci82.2.0forWindows:https://pecl.php.net/package/oci8/2.2.0/windows下载并解压,把php_oci8.dll,php_oci8_11g.dll,php_oci8_12c......
  • Caused by: java.sql.SQLSyntaxErrorException: ORA-00923: 未找到要求的 FROM 关键字
    最终是,查询条件,入参为null,所导致。JDBCgetParameterTypecallfailed-usingfallbackmethodinsteadRA-00923:FROMkeywordnotfoundwhereexpected 进一步,这个错误,在job执行的时候,会导致,oracle游标不够ORA-01000maximumopencursorsexceeded   参考: ......
  • 泛微E-cology9 browser.jsp SQL注入漏洞QVD-2023-5012
    漏洞简介泛微e-cology9存在SQL注入漏洞,攻击者可利用该漏洞获取数据库敏感信息。影响版本泛微e-cologyV9<10.56漏洞复现fofa语法:app="泛微-协同商务系统"登录页面:POC:POST/mobile/%20/plugin/browser.jspHTTP/1.1Host:115.236.39.115:8088User-Agent:Mozilla/5.0(W......
  • 一台机器同时运行多个Tomcat服务解决方案(2017更新)
    作者:fbysss关键字:Tomcat  如何在一台服务器上安装多个Tomcat假设有2个tomcat,分别为/usr/local/tomcat/tomcat-app1/usr/local/tomcat/tomcat-app2以第一个为例:1.修改环境变量sudovi/etc/profile添加export CATALINA_HOME_APP1=/usr/local/......
  • BUUCTF [SWPU2019]Web1
    进入网站,注册登录,进到申请发布广告,应该就是在这里实现注入。首先尝试:1'or1=1#标题含有敏感词汇应该是哪里被过滤了。经过尝试后是or被过滤了,--+,#等其他的注释符也被过滤了。经过测试后,结尾可以用单引号闭合。再次尝试:1'showdatabases()'1'showdatabases()'空格被......
  • BUUCTF [CISCN2019 华东南赛区]Web11
    切入点如图:测试模板注入最后或者payload:X-Forwarded-For:{ifreadfile('/flag')}{/if}原理是Smarty已经废弃{php}标签。在Smarty3.1,{php}仅在SmartyBC中可用。Smarty的{if}条件判断和PHP的if非常相似,只是增加了一些特性。每个{if}必须有一个配对的{/if}。全部的PHP条件表......
  • 【2023-09-01】台风来咯
    20:00只有自己怀着希望的时候,才能把希望带给别人。越是艰难的时候,希望是唯一让你坚持下去的理由。                                                 ——阿兰“苏拉”......