题意:

有n件物品,对应有不同的价格和价值,这是典型的01背包。但现在有了一个限制,要买物品先买能装这件物品的特定的盒子,盒子的价值为0

代码理解得还不是太好,感觉这是一个“二重”的01背包。首先假设先买第i个盒子,对每个盒子里的物品进行一次01背包;然后对盒子再进行一次01背包,决策到底要不要买这个盒子

dp[i][j]表示前i个盒子有j元钱能获得的最大价值,则所求就是dp[n][total]

因为物品对盒子有了“依赖”,所以要先对dp赋值为-1,表示买不到盒子就更不可能装物品

这篇题解写的很详细:

http://www.acmerblog.com/hdu-3449-consumer-5475.html

代码虽短,还须多多体会

 1 //#define LOCAL
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6
 7 const int maxn = 100000 + 10;
 8 int dp[52][maxn];
 9
10 int main(void)
11 {
12     #ifdef LOCAL
13         freopen("3449in.txt", "r", stdin);
14     #endif
15
16     int n, total;
17     while(scanf("%d%d", &n, &total) == 2)
18     {
19         memset(dp, -1, sizeof(dp));
20         memset(dp[0], 0, sizeof(dp[0]));
21         for(int i = 1; i <= n; ++i)
22         {
23             int box, m;
24             scanf("%d%d", &box, &m);
25             for(int j = box; j <= total; ++j)
26                 dp[i][j] = dp[i - 1][j - box];  //假设先买第i个盒子
27             for(int j = 0; j < m; ++j)
28             {//对盒子里的物品进行01背包
29                 int c, w;
30                 scanf("%d%d", &c, &w);
31                 for(int k = total; k >= c; --k)
32                     if(dp[i][k - c] != -1)
33                         dp[i][k] = max(dp[i][k], dp[i][k - c] + w);
34             }
35             for(int j = 0; j <= total; ++j)
36                 dp[i][j] = max(dp[i][j], dp[i - 1][j]);     //决策是否买第i个盒子
37         }
38         printf("%d\n", dp[n][total]);
39     }
40     return 0;
41 }

代码君

另外,可以用滚动数组来优化空间

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/3962456.html

HDu 3449 (有依赖的01背包) Consumer相关推荐

  1. hdu 3449 有依赖性的01背包

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3449 Consumer Description FJ is going to do som ...

  2. hdu 6149 Valley Numer II(01背包套状压dp)

    题目链接:hdu 6149 Valley Numer II 题意: 给你N个点,有k个为高点,其他为低点,现在这N个点有m条边,问你最多能组成多少个两个高点一个低点,低点和两个高点都有边相连这样的状态 ...

  3. hdu 2602 Bone Collector(01背包)

    题意:给出包裹的大小v,然后给出n块骨头的价值value和体积volume,求出一路下来包裹可以携带骨头最大价值 思路:01背包 1.二维数组(不常用 #include<iostream> ...

  4. hdu 6092 Rikka with Subset 01背包 思维

    dp[i][j]表示前i个元素,子集和为j的个数.d[i][j] = d[i][j] + d[i-1][j-k] (第i个元素的值为k).这里可以优化成一维数组 比如序列为 1 2 3,每一步的dp值 ...

  5. hdu 1864 最大报销额01背包dp

     最大报销额 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Subm ...

  6. hdu 2546 饭卡(01背包)

    题意:只要最后留下的钱够5元,就可以买下最贵的食物,使得余额最低,其他的钱的使用就是一个最大背包问题了. 代码: #include<iostream> #include<cstrin ...

  7. hdu 2602 Bone Collector(01背包)模板

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 Bone Collector Time Limit: 2000/1000 MS (Java/Ot ...

  8. hdu 2546 饭卡【01背包】

    题目链接:https://vjudge.net/contest/103424#problem/C 饭卡                                Time Limit: 5000/ ...

  9. HDU 5616 Jam's balance(01背包)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=5616 题目: Jam's balance Time Limit: 2000/1000 MS (Java ...

最新文章

  1. PNAS-2018-病原菌在植物免疫下的转录组
  2. 动图|几张动图告诉你,工业机器人无所不能!
  3. 如何在Linux下使用Gitblit工具创建Git仓库服务
  4. 【Android Gradle 插件】ProductFlavor 配置 ( ProductFlavor#buildConfigField 方法 | 单独编译生成 BuildConfig 类的任务 )
  5. python3中的type与object
  6. P1982 小朋友的数字
  7. LSTM+MDN【混合密度网络】---sketch rnn
  8. [文章摘录] Strategies for Early-Stage Collaborative Design (IEEE Software, 2012)
  9. 基于STM32的(NB-IOT(BC26))温湿度监测系统
  10. spring中的aop的xml配置方式简单实例
  11. UnicodeDecodeError ‘gbk‘ codec can‘t decode byte 0x93 in position 6325 illegal multibyte sequence
  12. 下载json文件,解决浏览器对JSON文件链接直接打开问题
  13. C基础 | 【05】(内存结构以及复合类型)
  14. 【虚基类、虚函数及应用】
  15. 从入门到精通:学习编程的必要步骤
  16. 使用 awk 处理一个对齐问题
  17. 关于振弦采集模块及采集仪振弦频率值准确率的问题
  18. 比尔·盖茨:关于新冠疫苗你需要知道的事
  19. 谈一谈|多处引用文献解决办法
  20. OpenMAX编程-组件

热门文章

  1. 什么是 AIDL 以及如何使用
  2. 关于Could not parse configuration: /hibernate.cfg.xml的问题
  3. eclipse + android 自动补全
  4. HDU 1253 胜利大逃亡
  5. C# Null 赋值
  6. 理解 Android 的 Binder 机制
  7. Android 中的GC资料网站
  8. Reconstruct binary tree
  9. 算法--旋转链表(Java)
  10. 内核中设置文件结束符_Linux 日志文件系统原来是这样工作的