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]);
        }
    }
    
  • 相关阅读:
    Mysql锁
    开源的13个Spring Boot 优秀学习项目!超53K星,一网打尽!
    大批量数据处理方法
    位运算题目
    限流算法
    linux进程管理之进程创建(三)
    Linux进程管理之状态(二)
    linux进程管理之概念(一)
    #error 、 #line 和 #pragma 的使用
    #undef 的用法
  • 原文地址:https://www.cnblogs.com/OFSHK/p/11976780.html
Copyright © 2011-2022 走看看