zoukankan      html  css  js  c++  java
  • 三种简单背包问题模板:01背包、完全背包、多重背包

    01背包

    概念:给定n种物品的价值和重量,每种物品最多只能取一次。求出当背包容量为m时能够装下的最大价值

    代码:一维的写法,dp数组代表的是当前状态能够放下的最大价值

    for(int i=0;i<n;i++)
    {
        for(int j=m;j>=w[i];j--)
              dp[j]=max(dp[j],dp[j-w[i]]+v[i]);   
        // 对于第i件物品,可以放或不放。不放:dp[j]=dp[j]:放:j-w[i]确保有足够的空间,dp[j]=dp[j-w[i]]+v[i]
    }
    

    完全背包

    概念:给定n种物品的价值和重量,每种物品可以取多次。求出当背包容量为m时能够装下的最大价值

    代码:一维的写法

    for(int i=0;i<n;i++)
    {
         for(int j=w[i];j<=m;j++)
            dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
    }       
    

    注意:

    01背包和完全背包的一维写法的区别在于for循环的第二层循环的遍历顺序

    01背包:从m开始--、完全背包:从w[i]开始++

    多重背包

    概念:给定n种物品的价值和重量,每种物品最多可以取k次。求出当背包容量为m时能够装下的最大价值

    代码:

    for(int i=0;i<n;i++) //大米种类
    {
        for(int j=0;j<daishu[i];j++)//每种大米的袋数
        {
            for(int k=m;k>=p[i];k--)//从总金额开始
                dp[k]=max(dp[k],dp[k-p[i]]+w[i]);
        }
    }
    
  • 相关阅读:
    day06 tar命令使用,vim简单操作以及linux开机过程
    day05 创建用户过程、文件夹,文件等权限修改等
    简单算法
    day04
    day03
    Vim常用快捷键
    day02
    ssh注解开发
    spring07 JDBC
    spring06Aop
  • 原文地址:https://www.cnblogs.com/OFSHK/p/11976780.html
Copyright © 2011-2022 走看看