HDU3449_Consumer
2015-09-10 00:25
387 查看
这个是一个背包的变形题,很值得仔细体味
大致题意:
这个比普通背包多一个限制:再选每一类物品之前必须要先购买一个篮子来装,篮子有一定的价格,其他就和背包是一样的了
思路:
为了能够体现篮子的价值,我们可以多加一维表示当前买第i个篮子和不买的情况
dp[i][j][0]表示用j个金币且第i个物品篮子没有买的前提下能获得最多的价值
dp[i][j][1]表示用j个金币且第i个物品篮子已经买的前提下能获得最多的价值
那么状态建好了,下面试着进行状态转移
dp[i][j][0] = max([b]dp[i-1][j][0], [b]dp[i-1][j][1][/b]);[/b]
[b][b]dp[i][j][1]的状态转移稍微复杂一点,因为第i类物品有好几个,这个时候我们就要对i类每一个物品进行01选择
[/b][/b]
[b][b]设当前物品价格p价值v[/b][/b]
哈哈多么漂亮机智的移到
Description
FJ is going to do some shopping, and before that, he needs some boxes to carry the different kinds of stuff he is going to buy. Each box is assigned to carry some specific kinds of stuff (that is to say, if he is going to buy one
of these stuff, he has to buy the box beforehand). Each kind of stuff has its own value. Now FJ only has an amount of W dollars for shopping, he intends to get the highest value with the money.
Input
The first line will contain two integers, n (the number of boxes 1 <= n <= 50), w (the amount of money FJ has, 1 <= w <= 100000) Then n lines follow. Each line contains the following number pi (the price of the ith box 1<=pi<=1000),
mi (1<=mi<=10 the number goods ith box can carry), and mi pairs of numbers, the price cj (1<=cj<=100), the value vj(1<=vj<=1000000)
Output
For each test case, output the maximum value FJ can get
Sample Input
Sample Output
大致题意:
这个比普通背包多一个限制:再选每一类物品之前必须要先购买一个篮子来装,篮子有一定的价格,其他就和背包是一样的了
思路:
为了能够体现篮子的价值,我们可以多加一维表示当前买第i个篮子和不买的情况
dp[i][j][0]表示用j个金币且第i个物品篮子没有买的前提下能获得最多的价值
dp[i][j][1]表示用j个金币且第i个物品篮子已经买的前提下能获得最多的价值
那么状态建好了,下面试着进行状态转移
dp[i][j][0] = max([b]dp[i-1][j][0], [b]dp[i-1][j][1][/b]);[/b]
[b][b]dp[i][j][1]的状态转移稍微复杂一点,因为第i类物品有好几个,这个时候我们就要对i类每一个物品进行01选择
[/b][/b]
[b][b]设当前物品价格p价值v[/b][/b]
dp[i][j][1] = max(dp[i][j][1], dp[i][j-c-p][0]+v, dp[i][j-p][1] + v);
哈哈多么漂亮机智的移到
Description
FJ is going to do some shopping, and before that, he needs some boxes to carry the different kinds of stuff he is going to buy. Each box is assigned to carry some specific kinds of stuff (that is to say, if he is going to buy one
of these stuff, he has to buy the box beforehand). Each kind of stuff has its own value. Now FJ only has an amount of W dollars for shopping, he intends to get the highest value with the money.
Input
The first line will contain two integers, n (the number of boxes 1 <= n <= 50), w (the amount of money FJ has, 1 <= w <= 100000) Then n lines follow. Each line contains the following number pi (the price of the ith box 1<=pi<=1000),
mi (1<=mi<=10 the number goods ith box can carry), and mi pairs of numbers, the price cj (1<=cj<=100), the value vj(1<=vj<=1000000)
Output
For each test case, output the maximum value FJ can get
Sample Input
3 800 300 2 30 50 25 80 600 1 50 130 400 3 40 70 30 40 35 60
Sample Output
210
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<string> #include<queue> #include<cstdlib> #include<algorithm> #include<stack> #include<map> #include<queue> #include<vector> using namespace std; const int maxn = 1e5+100; const int INF = 0x7f7f7f7f; #define pr(x) cout << #x << " = " << x << " "; #define prln(x) cout << #x << " = " << x <<endl; #define ll long long int max(int a,int b,int c){ return max(max(a,b),c); } int dp[maxn][2], p, c, v, num; int main(){ #ifdef LOCAL freopen("C:\\Users\\User Soft\\Desktop\\in.txt","r",stdin); //freopen("C:\\Users\\User Soft\\Desktop\\out.txt","w",stdout); #endif int n, m, k; while(scanf("%d%d", &n, &m)==2){ memset(dp,0,sizeof dp); for(int i = 1; i <= n; ++i) { scanf("%d%d", &p, &num); for(int j = 0; j <=m; ++j){ dp[j][0] = max(dp[j][0], dp[j][1]); if(j < p) dp[j][1] = -INF; else dp[j][1] = 0; } for(int j = 1; j <= num; ++j) { scanf("%d%d",&c, &v); for(int j = m; j >= 0; --j) { if(j >= p + c) dp[j][1] = max(dp[j-c-p][0] + v, dp[j-c][1] + v, dp[j][1]); } } } cout << max(dp[m][1], dp[m][0]) << "\n"; } return 0; }
相关文章推荐
- hdu 5113 Black And White
- 【抽象代数】 07 - 因子分解和多项式环
- Quick-Cocos2d-x初学者游戏教程(二) -------------------- Quick内部的代码结构及相应的原理
- Oracle Analyze 命令 详解
- 条款20:宁以pass-by-reference-to-const替换pass-by-value(Prefer pass-by-reference-to-const to pass-by-value)
- blkio.weight使用感想
- 08R2-12R2基于访问权限的文件枚举
- 08R2-12R2基于访问权限的文件枚举
- 移动 app 测试工具 bugtags
- 45个实用的JavaScript技巧、窍门和最佳实践
- FZU 2156 Climb Stairs
- Quick-Cocos2d-x初学者游戏教程(一)--------------------Quick的一些基础知识
- 利用顺序表实现多项式相加
- 2015年9月9日
- Centos 安装配置iscsi
- 图片的异步加载(双缓存)+ViewHolder
- 黑马程序员 abstract class和interface的区别
- redis conf文件解释
- 利用顺序表实现集合的并运算
- 转发和重定向的区别