完全背包变型题(hdu5410)
这是2015年最后一场多校的dp题,当时只怪自己基础太差,想了1个多小时才想出来,哎,9月份好好巩固基础,为区域赛做准备。题目传送门
题目的意思是给你n元钱,m类糖果,每类糖果分别有p, a, b, p表示单价,假设付了w*p元,那么他能获得a*w + b个糖果。求最大的糖果数。
当时一看到这题,觉得是完全背包,设dp[i][j]表示买到第i件物品的时候已经花了j元钱,所得到的最多的糖果数。
很容易想到转移方程为:
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - k * p] + a * k + b);(k > 0 && k * p <= j)
当信心十足准备敲的时候才忽然发现时间复杂度为O(n^3), 而n 最大为1000,毫无疑问会超时。怎么办?
然后我们就想我们用01背包的思维去想这题,就可以把它优化到O(n^2)了;然后突然又发现一个问题,因为多了个b,发现处理的时候要考虑是否是第一次买,那么我们就开个vis数组来表示有无买过,1表示买过,0表示没有。
附上总代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int N = + ; int T, n, m; int p[N], a[N], b[N]; int vis[N][N], dp[N][N]; void work(){
memset(dp, , sizeof(dp));
memset(vis, , sizeof(vis));
for(int i = ; i <= n; i ++){
for(int j = ; j <= m; j ++){
dp[i][j] = dp[i - ][j];
if(j >= p[i]){
int t = dp[i][j - p[i]] + a[i];
if(!vis[i][j - p[i]]) t += b[i];
int t1 = dp[i - ][j - p[i]] + a[i] + b[i];
if(t1 > t) t = t1;
if(t > dp[i][j]){
dp[i][j] = t;
vis[i][j] = ;
}
}
}
}
printf("%d\n", dp[n][m]);
} int main(){
scanf("%d", &T);
while(T--){
scanf("%d%d", &m, &n);
for(int i = ; i <= n; i ++) scanf("%d%d%d", p + i, a + i, b + i);
work();
}
return ;
}
完全背包变型题(hdu5410)的更多相关文章
- HDU 1712 ACboy needs your help (分组背包模版题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1712 有n门课,和m天时间.每门课上不同的天数有不同的价值,但是上过这门课后不能再上了,求m天里的最大 ...
- hdu 2191 珍惜现在,感恩生活 多重背包入门题
背包九讲下载CSDN 背包九讲内容 多重背包: hdu 2191 珍惜现在,感恩生活 多重背包入门题 使用将多重背包转化为完全背包与01背包求解: 对于w*num>= V这时就是完全背包,完全背 ...
- HDU 1248 寒冰王座(全然背包:入门题)
HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...
- [Usaco2008 Dec]Hay For Sale 购买干草[01背包水题]
Description 约翰遭受了重大的损失:蟑螂吃掉了他所有的干草,留下一群饥饿的牛.他乘着容量为C(1≤C≤50000)个单位的马车,去顿因家买一些干草. 顿因有H(1≤H≤5000)包 ...
- hihoCoder #1038 : 01背包(板子题)
#1038 : 01背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励 ...
- HDU 1248 寒冰王座(完全背包裸题)
寒冰王座 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- POJ 3624 Charm Bracelet(01背包裸题)
Charm Bracelet Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 38909 Accepted: 16862 ...
- HDU 2602 Bone Collector(01背包裸题)
Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- 洛谷P2918 [USACO08NOV]买干草(一道完全背包模板题)
题目链接 很明显的一道完全背包板子题,做法也很简单,就是要注意 这里你可以买比所需多的干草,只要达到数量就行了 状态转移方程:dp[j]=min(dp[j],dp[j-m[i]]+c[i]) 代码如下 ...
随机推荐
- #一周五# (视频) 手掌四轴Estes 4606,树莓派2和WRTNode,WinHEC 2015深圳
又到周五,本周<快速创建网站>系列接近尾声,主要部分已经完成,还差最后一篇博主我正在整理.这里给大家分享一些最近看到的有意思的东西. 手掌四轴飞行器 无人机这段时间可是大出风头,DJI或者 ...
- PHP数据的序列化/反序列化
最近在接触一个叫做medoo的mysql框架,这个框架有一个特点,在insert/update时,如果你给进的数据是array的话会自动转成序列化字符串,说实话这个东西以前还没怎么接触过,索性去搜索了 ...
- Asp.net MVC验证那些事(1)-- 介绍和验证规则使用
数据的有效性验证,是程序开发中必不可少的环节.这篇文章,我们将用一个实例来说明如何在MVC中使用Validation来保证无论是新增或者更新数据的时候,都必须符合我们定义的验证规则,否则就会提示错误. ...
- 问题解决——开启Guest后仍无法共享打印机
==================================声明================================== 本文版权归作者所有 未经作者授权 请勿转载 保留法律追究的 ...
- SQL Server求解最近多少销售记录的销售额占比总销售额的指定比例
看园中SQL Server大V潇潇隐者的博文,发现一边文就是描述了如标题描述的问题. 具体的问题描述我通过潇潇隐者的博文的截图来阐释: 注意:如果以上截取有所侵权,也请作者告知,再次感谢. 当 ...
- C# ADO.NET编写简单的图书馆管理软件
使用软件: Microsoft SQL Server 2012 Microsoft Visual Studio 2012 本文地址: http://www.cnblogs.com/go2bed/ 参考 ...
- C++学习笔记【转载】
转载自:http://www.cnblogs.com/maowang1991/p/3290321.html 1.struct成员默认访问方式是public,而 class默认访问方式是private! ...
- [转]Oracle Form 触发器执行顺序
Trigger 不是数据库中的触发器,不过功能类似,都是当某个事件发生的时候会触发. Trigger中可以编写代码,当对应事件发生的时候就会执行该Trigger中的代码. Oracle Form中的T ...
- What makes an excellent front-end developer?(for my English speech)
What makes an excellent front-end developer? Let me please start this talking by saying that what is ...
- 三星s4宣传片配色有惊喜
三星s4宣传片配色有惊喜据了解,一周前,三星曾对外发布了新旗舰手机galaxy s4的宣传视频,不过那份视频里所含信息仅仅只有s4发布会的邀请函.而日前,三星官方发布了s4的第二弹宣传片则暗示该机在配 ...