【t067】补充装备
Time Limit: 1 second
Memory Limit: 128 MB
【问题描述】
Mini进入洞口前自然要先来到镇里的装备店买些装备。买每件装备都需要付出一定的体力点,同时也会获得一定的能力点(每种装备
都可以买无限次^_^,但人的体力点可是有限的哦^_^)。当同种装备挑选的数量>=5时,除了挑选这些物品所获得的能力点之外
还会获得额外的Q*K(K表示挑选的数量)点的能力点。但是,同样的,Mini也会付出更多的体力点,即体力点还将多付出Q*K(K
表示挑选的数量)点。挑选的物品越多,产生的力量就越大,体力点也会付出越多。不过,这额外获得的能力点和付出的体
力点是可以不要的。为了能获得最大的能力点,同时也不至于使自己过分劳累(体力恰好为0不算过分劳累),Mini应该如何购
买装备呢?
【输入格式】
第一行,两个数N和M,N表示有多少种装备,0<=N<=340,每种装备可以买无限次。M表示Mini所拥有的体力点数,0<=M<=500。
以下N行,第I行三个数, WI,QI,Q。WI表示买第I个装备所付出的体力点,QI表示买第I个装备能获得的能力点,Q表示当第I个装备
的数量>=5时所产生的共鸣点。1<=WI<=9000,0<=QI<=9000,0<=Q<=9000。
【输出格式】
一个数,表示在保证Mini不会过分劳累的情况下所能买到的最大能力点
Sample Input
5 87
35 48 7
3 57 6
45 9 24
3 4 0
5 7 7
Sample Output
1653
【题解】 这题比较烦的地方是,多出来的额外能力点。但是其有说,如果不想要的话,可以不用花费额外的体力获得额外的技能点。也就是说。我可以买一个东西买了6个,但是不消耗额外体力获得5*q+6*q能力点的情况是允许的。 考虑到这种情况。我们先不要管那些额外技能点。 先按照给出的w[i],c[i]进行完全背包的操作。 会有两层for for i 和for j j是容量。 然后我们不能等这两层循环都结束之后再去处理额外能力点的问题。而应该在i层循环中一边处理不考虑额外能力点的完全背包问题一边在完全背包结束后考虑额外能力点的问题。 因为额外能力点也是一个完全背包。所以其更新方式也是顺序更新。 同时在不考虑额外能力点的完全背包中。要记录f[j]对应的num[j],即f[j]是在买了几个装备后获得的值。然后在单独考虑额外能力点的完全背包中。我们同样枚举j,只有在num[j] >=4的时候才尝试更新,即如果num[j] >=4 则看一下ju = j + (num[j]+1)*q[i] 是否大于m,如果不大于,则查看 f[j+(num[j]+1)*q[i]] 和 f[j] + (num[j]+1)*q[i]的大小关系。如果前者小于后者,则更新前者。 同时修改num[j+(num[j]+1)*q[i]]的值为num[j]+1; 因为是以j为更新起点,所以是num[j] >=4,因为再买一个装备就变成5了。 这段题解可以根据代码来理解。 【代码】#include <cstdio>#include <cstring>int n,m,w[400],c[400],q[400],f[600] = {0},num[600] = {0}; int main()
{
//freopen("F:\\rush.txt","r",stdin);
scanf("%d%d",&n,&m);
for (int i = 1;i <= n;i++)
scanf("%d%d%d",&w[i],&c[i],&q[i]);
for (int i = 1;i <= n;i++)
{<span style="white-space:pre"> </span>memset(num,sizeof(num),0);
for (int j = w[i];j <= m;j++) //先进行一次完全背包 不考虑多出来的额外技能点
if (f[j] < f[j-w[i]] + c[i])
{
f[j] = f[j-w[i]] + c[i];
num[j] = num[j-w[i]] + 1;
}
for (int j = 0;j <= m;j++) //考虑额外技能点,因为也是完全背包所以顺序枚举
if (num[j] >= 4) //如果数目大于等于4再更新一个装备就能>=5了
{
int ju = j+(num[j]+1) * q[i]; //这是所需要的花费
if (ju > m) continue;
if (f[ju] < f[j] + q[i] * (num[j]+1))
{
f[ju] = f[j] + q[i] * (num[j]+1); //加上相应的价值 看看是否更优
num[ju] = num[j] + 1; //同时要更新数目
}
}
}
printf("%d",f[m]);
return 0;
}
【t067】补充装备的更多相关文章
随机推荐
- JS学习笔记 - fgm练习 - 网页换肤
总结: 1. 点击按钮,div内部变色,边框保持颜色不变. 实现原理:其实本来就把background 和 border 分别设置了同一个颜色,看似是一个整体,其实本来就是分开的. 那么点击的时候,只 ...
- C语言创建删不掉的目录
上一篇博客写了一个杀不死的进程,如今再写一个删不掉的目录(文件同理),所谓删不掉不是真的删不掉而是删掉后立即又一次创建. 代码例如以下: #include <stdio.h> #inclu ...
- Unity3d 布娃娃系统
选中带骨骼的3d模型 GameObject->Create Other->Ragdoll... 点开发现弹出了一个Create Ragdoll的窗体 前面的基础transform把骨骼拖进 ...
- 重构——DataTable转泛型
泛型简单介绍 泛型能够最大限度的重用代码.保护类型的安全.提高性能. 泛型最常见的用途是创建集合类 泛型数据类型中使用的信息可在执行时通过反射 ...
- IIS服务器设置http自动跳转https方法
很多站长在部署SSL证书后,网站实现https加密访问,但考虑到用户习惯了http访问,很多外链也是http访问形式,所以需要在IIS服务器配置http自动跳转https,避免用户通过http访问不到 ...
- ZOJ 2421 Recaman's Sequence
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1421 题目大意: 定义a^m为 a^m = a^(m-1) - m 如果a^ ...
- 3、U-boot的环境变量: bootcmd 和bootargs
u-bootcmdbootcmd是uboot自动启动时默认执行的一些命令,因此你可以在当前环境中定义各种不同配置,不同环境的参数设置,然后设置bootcmd为你经常使用的那种参数. 现在我的boo ...
- ivotal-tc-Server与Tomcat区别
Pivotal-tc-Server之前叫做SpringSource tc Server,包含三个版本分别是:Spring版.标准版和开发版,但其中只有开发版是免费的.比如在STS中包含的版本就是开发板 ...
- bootstrap课程2 bootstrap的栅格系统的主要作用是什么
bootstrap课程2 bootstrap的栅格系统的主要作用是什么 一.总结 一句话总结:响应式布局(就是适应不同的屏幕,手机,平板,电脑) 1.bootstrap的栅格系统如何使用? row ...
- Sql Server 删除所有表 脚本
如果由于外键约束删除table失败,则先删除所有约束: --/第1步**********删除所有表的外键约束*************************/ DECLARE c1 cursor f ...