博客
关于我
【DP】分组背包
阅读量:362 次
发布时间:2019-03-04

本文共 1900 字,大约阅读时间需要 6 分钟。

背包容量为v的背包问题需要找到一种物品选择方式,使得背包的总价值最大化。物品被分成t组,每组最多选一个物品。这意味着在选择物品时,需要考虑每组的限制条件。

动态规划解决方案

动态规划(DP)是一种有效的方法来解决这类背包问题。我们可以使用一个数组dp[j],其中dp[j]表示背包容量为j时的最大价值。初始化时,dp数组的所有元素都设为0,表示没有物品被选取时的价值。

步骤如下:

  • 按组别处理每个组别:从组号1到t,依次处理每个组别。
  • 按背包容量反向处理:从背包容量v到0,反向处理以避免重复计数。
  • 遍历每个组中的物品:对于每个组,遍历其包含的物品。
  • 更新DP数组:检查当前物品的重量是否在当前背包容量范围内。如果是,更新dp[j]为最大值,即dp[j] = max(dp[j], dp[j - 物品重量] + 物品价值)。
  • 这种方法确保每个组别最多选择一个物品,从而满足题目要求。

    代码实现

        

    题目大意

    背包容量为v。现有n个物品,每个物品有重量、价值和所属组号。物品分成t组,每组最多选一个物品。求背包能装下的最大价值。

    输入

    第一行:三个整数v、n、t;

    接下来的n行:每行三个整数wi、ci、pj,分别表示每个物品的重量、组号和价值。

    输出

    仅一行,表示最大总价值。


    思路

    使用动态规划解决方案。初始化一个dp数组,dp[j]表示重量为j时的最大价值。遍历每个组别,逐个处理每个物品,更新dp数组以考虑是否选择该物品。确保每个组别最多选一个物品,从而得到最大价值。


    代码

        #include 
    #include
    using namespace std; int v, n, t; int a[11][11] = {0}; int b[11][11] = {0}; int c[11] = {0}; void init() { int zl, jz, zb; scanf("%d %d %d", &v, &n, &t); for (int i = 1; i <= n; ++i) { scanf("%d %d %d", &zl, &jz, &zb); a[zb][c[zb]] = zl; b[zb][c[zb]] = jz; c[zb]++; } } void work() { int dp[v+1] = {0}; for (int i = 1; i <= t; ++i) { for (int j = v; j > 0; --j) { for (int k = 1; k <= c[i]; ++k) { if (j >= a[i][k]) { if (dp[j] < dp[j - a[i][k]] + b[i][k]) { dp[j] = dp[j - a[i][k]] + b[i][k]; } } } } } printf("%d", dp[v]); } int main() { init(); work(); return 0; }

    代码解释

  • 输入处理:读取背包容量v、物品数量n和组别数t。然后读取每个物品的重量、价值和组号,并存储在相应的数组中。
  • 动态规划初始化:创建一个大小为v+1的dp数组,初始化所有元素为0。
  • 处理每个组别:按组别遍历,逐个处理每个物品。
  • 更新背包状态:从背包容量v到0反向遍历,避免重复使用物品。对于每个物品,检查是否可以加入背包,并更新dp数组的最大价值。
  • 输出结果:打印dp[v],表示在背包容量v下的最大价值。
  • 这种方法确保每个组别最多选择一个物品,从而满足题目要求,并通过动态规划高效地解决了问题。

    转载地址:http://cuug.baihongyu.com/

    你可能感兴趣的文章
    npm如何清空缓存并重新打包?
    查看>>
    npm学习(十一)之package-lock.json
    查看>>
    npm安装 出现 npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT npm ERR! 解决方法
    查看>>
    npm安装crypto-js 如何安装crypto-js, python爬虫安装加解密插件 找不到模块crypto-js python报错解决丢失crypto-js模块
    查看>>
    npm安装教程
    查看>>
    npm报错Cannot find module ‘webpack‘ Require stack
    查看>>
    npm报错Failed at the node-sass@4.14.1 postinstall script
    查看>>
    npm报错File to import not found or unreadable: @/assets/styles/global.scss.
    查看>>
    npm报错unable to access ‘https://github.com/sohee-lee7/Squire.git/‘
    查看>>
    npm版本过高问题
    查看>>
    npm的“--force“和“--legacy-peer-deps“参数
    查看>>
    npm的安装和更新---npm工作笔记002
    查看>>
    npm的常用配置项---npm工作笔记004
    查看>>
    npm的问题:config global `--global`, `--local` are deprecated. Use `--location=global` instead 的解决办法
    查看>>
    npm编译报错You may need an additional loader to handle the result of these loaders
    查看>>
    npm设置淘宝镜像、升级等
    查看>>
    npm设置源地址,npm官方地址
    查看>>
    npm配置安装最新淘宝镜像,旧镜像会errror
    查看>>
    NPM酷库052:sax,按流解析XML
    查看>>
    npm错误 gyp错误 vs版本不对 msvs_version不兼容
    查看>>