HDu 3449 (有依赖的01背包) Consumer
题意:
有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相关推荐
- hdu 3449 有依赖性的01背包
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3449 Consumer Description FJ is going to do som ...
- hdu 6149 Valley Numer II(01背包套状压dp)
题目链接:hdu 6149 Valley Numer II 题意: 给你N个点,有k个为高点,其他为低点,现在这N个点有m条边,问你最多能组成多少个两个高点一个低点,低点和两个高点都有边相连这样的状态 ...
- hdu 2602 Bone Collector(01背包)
题意:给出包裹的大小v,然后给出n块骨头的价值value和体积volume,求出一路下来包裹可以携带骨头最大价值 思路:01背包 1.二维数组(不常用 #include<iostream> ...
- 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值 ...
- hdu 1864 最大报销额01背包dp
最大报销额 Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Subm ...
- hdu 2546 饭卡(01背包)
题意:只要最后留下的钱够5元,就可以买下最贵的食物,使得余额最低,其他的钱的使用就是一个最大背包问题了. 代码: #include<iostream> #include<cstrin ...
- hdu 2602 Bone Collector(01背包)模板
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 Bone Collector Time Limit: 2000/1000 MS (Java/Ot ...
- hdu 2546 饭卡【01背包】
题目链接:https://vjudge.net/contest/103424#problem/C 饭卡 Time Limit: 5000/ ...
- HDU 5616 Jam's balance(01背包)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=5616 题目: Jam's balance Time Limit: 2000/1000 MS (Java ...
最新文章
- PNAS-2018-病原菌在植物免疫下的转录组
- 动图|几张动图告诉你,工业机器人无所不能!
- 如何在Linux下使用Gitblit工具创建Git仓库服务
- 【Android Gradle 插件】ProductFlavor 配置 ( ProductFlavor#buildConfigField 方法 | 单独编译生成 BuildConfig 类的任务 )
- python3中的type与object
- P1982 小朋友的数字
- LSTM+MDN【混合密度网络】---sketch rnn
- [文章摘录] Strategies for Early-Stage Collaborative Design (IEEE Software, 2012)
- 基于STM32的(NB-IOT(BC26))温湿度监测系统
- spring中的aop的xml配置方式简单实例
- UnicodeDecodeError ‘gbk‘ codec can‘t decode byte 0x93 in position 6325 illegal multibyte sequence
- 下载json文件,解决浏览器对JSON文件链接直接打开问题
- C基础 | 【05】(内存结构以及复合类型)
- 【虚基类、虚函数及应用】
- 从入门到精通:学习编程的必要步骤
- 使用 awk 处理一个对齐问题
- 关于振弦采集模块及采集仪振弦频率值准确率的问题
- 比尔·盖茨:关于新冠疫苗你需要知道的事
- 谈一谈|多处引用文献解决办法
- OpenMAX编程-组件