hdu 3449(依赖背包) Consumer
2015-07-16 00:44
323 查看
题意:
给n个箱子,每个箱子有个费用pi,每个箱子里面有m个物品,每个物品有两个属性,一个费用wi和一个价值vi。买物品的时候要把所属的箱子一起买了,问给一个金额W最多能获得多少价值?思路
依赖背包。《背包九讲》的第七讲讲了这个。设dp[i][j]为前i个箱子使用金额j获得的最大价值。
考虑每个箱子内部就是一个01背包,那么在枚举每一个箱子的时候,使用上一轮能满足本轮箱子费用的状态做一个01背包,然后本轮结束后更新dp数组。
最后的ans就是dp
[W]
需要深刻理解一下这个依赖关系。
复杂度:
O(n*m*W)参考code:
/* #pragma warning (disable: 4786) #pragma comment (linker, "/STACK:0x800000") */ #include <cassert> #include <cctype> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <sstream> #include <iomanip> #include <string> #include <vector> #include <list> #include <set> #include <map> #include <stack> #include <queue> #include <algorithm> #include <iterator> #include <utility> using namespace std; template< class T > T _abs(T n) { return (n < 0 ? -n : n); } template< class T > T _max(T a, T b) { return (!(a < b) ? a : b); } template< class T > T _min(T a, T b) { return (a < b ? a : b); } template< class T > T sq(T x) { return x * x; } template< class T > T gcd(T a, T b) { return (b != 0 ? gcd<T>(b, a%b) : a); } template< class T > T lcm(T a, T b) { return (a / gcd<T>(a, b) * b); } template< class T > bool inside(T a, T b, T c) { return a<=b && b<=c; } #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define F(i, n) for(int (i)=0;(i)<(n);++(i)) #define rep(i, s, t) for(int (i)=(s);(i)<=(t);++(i)) #define urep(i, s, t) for(int (i)=(s);(i)>=(t);--(i)) #define repok(i, s, t, o) for(int (i)=(s);(i)<=(t) && (o);++(i)) #define MEM0(addr) memset((addr), 0, sizeof((addr))) #define MP(x, y) make_pair(x, y) #define REV(s, e) reverse(s, e) #define SET(p) memset(pair, -1, sizeof(p)) #define CLR(p) memset(p, 0, sizeof(p)) #define MEM(p, v) memset(p, v, sizeof(p)) #define CPY(d, s) memcpy(d, s, sizeof(s)) #define READ(f) freopen(f, "r", stdin) #define WRITE(f) freopen(f, "w", stdout) #define SZ(c) (int)c.size() #define PB(x) push_back(x) #define ff first #define ss second #define ll long long #define ld long double #define pii pair< int, int > #define psi pair< string, int > #define ls u << 1 #define rs u << 1 | 1 #define lson l, mid, u << 1 #define rson mid, r, u << 1 | 1 const int maxn = 1e6+5; const ll INF = 0x3f3f3f3f3f3fLL; int dp[60][100010]; int tmp[100010]; int main(){ //READ("in.txt"); int n,W; while(scanf("%d%d",&n,&W)!=EOF){ MEM0(dp); int p,w,m,v; rep(i,1,n){ scanf("%d%d",&p,&m); MEM(tmp,-1); rep(j,p,W) tmp[j] = dp[i-1][j-p]; rep(j,1,m){ scanf("%d%d",&w,&v); urep(k,W,w) if(tmp[k-w] != -1) tmp[k] = max(tmp[k],tmp[k-w]+v); } rep(j,0,W) dp[i][j] = max(dp[i-1][j],tmp[j]); } printf("%d\n", dp [W]); } return 0; }
相关文章推荐
- JS算法*START寻找最短路径
- 监听键盘事件
- 求二叉树的深度,判定二叉树是否是平衡二叉树(java)
- 7.14-7.15总结
- 我的Android进阶之旅------>如何在多个LinearLayout中添加分隔线
- TestNG使用总结
- java设计模式学习之策略模式
- 程序中变量的存储
- 2015.7.15 第七课 课程重点(js、声明变量、数据类型)
- 乐观锁和悲观锁
- 第一百零四天 how can I 坚持
- HTTP 笔记与总结(6)referer 头与防盗链
- Codeforces Round #312 (Div. 2) E. A Simple Task 线段树 延时标记
- 幽灵按钮css3
- Java构造方法注意事项
- ASP.NET MVC 路由进阶(之二)--自定义路由约束
- LeetCodeOJ_172_Factorial Trailing Zeroes
- 加入目录结构
- css学习笔记四
- HTML5 – 2.新元素