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
代码虽短,还须多多体会
//#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; const int maxn = + ;
int dp[][maxn]; int main(void)
{
#ifdef LOCAL
freopen("3449in.txt", "r", stdin);
#endif int n, total;
while(scanf("%d%d", &n, &total) == )
{
memset(dp, -, sizeof(dp));
memset(dp[], , sizeof(dp[]));
for(int i = ; i <= n; ++i)
{
int box, m;
scanf("%d%d", &box, &m);
for(int j = box; j <= total; ++j)
dp[i][j] = dp[i - ][j - box]; //假设先买第i个盒子
for(int j = ; j < m; ++j)
{//对盒子里的物品进行01背包
int c, w;
scanf("%d%d", &c, &w);
for(int k = total; k >= c; --k)
if(dp[i][k - c] != -)
dp[i][k] = max(dp[i][k], dp[i][k - c] + w);
}
for(int j = ; j <= total; ++j)
dp[i][j] = max(dp[i][j], dp[i - ][j]); //决策是否买第i个盒子
}
printf("%d\n", dp[n][total]);
}
return ;
}
代码君
另外,可以用滚动数组来优化空间
HDu 3449 (有依赖的01背包) Consumer的更多相关文章
- hdu 3449 (有依赖的01背包)
		依赖背包 事实上,这是一种树形DP,其特点是每个父节点都需要对它的各个儿子的属性进行一次DP以求得自己的相关属性. fj打算去买一些东西,在那之前,他需要一些盒子去装他打算要买的不同的物品.每一个盒子 ... 
- hdu 3449 有依赖性的01背包
		题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3449 Consumer Description FJ is going to do so ... 
- HDU 5234 Happy birthday --- 三维01背包
		HDU 5234 题目大意:给定n,m,k,以及n*m(n行m列)个数,k为背包容量,从(1,1)开始只能往下走或往右走,求到达(m,n)时能获得的最大价值 解题思路:dp[i][j][k]表示在位置 ... 
- HDOJ(HDU).3466 Dividing coins ( DP 01背包 无后效性的理解)
		HDOJ(HDU).3466 Dividing coins ( DP 01背包 无后效性的理解) 题意分析 要先排序,在做01背包,否则不满足无后效性,为什么呢? 等我理解了再补上. 代码总览 #in ... 
- HDOJ(HDU).2546 饭卡(DP 01背包)
		HDOJ(HDU).2546 饭卡(DP 01背包) 题意分析 首先要对钱数小于5的时候特别处理,直接输出0.若钱数大于5,所有菜按价格排序,背包容量为钱数-5,对除去价格最贵的所有菜做01背包.因为 ... 
- HDOJ(HDU).2602 Bone Collector (DP 01背包)
		HDOJ(HDU).2602 Bone Collector (DP 01背包) 题意分析 01背包的裸题 #include <iostream> #include <cstdio&g ... 
- HDU 1864 最大报销额 0-1背包
		HDU 1864 最大报销额 0-1背包 题意 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上, ... 
- HDU 1011 Starship Troopers【树形DP/有依赖的01背包】
		You, the leader of Starship Troopers, are sent to destroy a base of the bugs. The base is built unde ... 
- hdu 2639 第k大01背包
		求每个状态里的k优解,然后合并 /* HDU 2639 求01背包的第k大解. 合并两个有序序列 */ #include<stdio.h> #include<iostream> ... 
随机推荐
- __dict__和__slots__
			__dict__: __slots__: 
- Sublime Text3激活 破解
			Sublime Text 是一个复杂的文本.代码编辑器.出色用户界面,非凡的功能和惊人的性能. Sublime Text 3 官方网站 http://www.sublimetext.com/ 点击菜单 ... 
- ZOJ 2971 Give Me the Number;ZOJ 2311 Inglish-Number Translator (字符处理,防空行,strstr)
			ZOJ 2971 Give Me the Number 题目 ZOJ 2311 Inglish-Number Translator 题目 //两者题目差不多,细节有点点不一样,因为不是一起做的,所以处 ... 
- POJ 1273 Drainage Ditches(网络流dinic算法模板)
			POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ... 
- 思考 ”前端开发人员都在关注的 GitHub 资源“
			点这里 原文: 资源 免费的计算机编程类中文书籍 免费编程书籍 计算机科学论文 codeparkshare Python初学者书籍.视频.资料.社区推荐 Python资料汇总 app应用推荐 码农周刊 ... 
- 【poj2478-Farey Sequence】递推求欧拉函数-欧拉函数的几个性质和推论
			http://poj.org/problem?id=2478 题意:给定一个数x,求<=x的数的欧拉函数值的和.(x<=10^6) 题解:数据范围比较大,像poj1248一样的做法是不可行 ... 
- 李洪强漫谈iOS开发[C语言-005]-程序结构分析
- list, set操作
			def union_list(l1, l2): result = [] if not l1: result.extend(l2) return result if not l2: result.ext ... 
- netbeans使用
			下载地址 https://netbeans.org/downloads/ https://netbeans.org/downloads/start.html?platform=linux&la ... 
- JLINK固件丢失或升级固件后提示Clone的解决办法
			J-LINK V8固件烧录指导 J-LINK 是使用过程中,如果内部固件意外损坏或丢失,请参考下面操作步骤说明,重新烧录JLINK固件. 安装固件烧录软件 请ATMEL官方网址下载AT91-ISP下载 ... 
