soj2222_01背包变形
来源:互联网 发布:淘宝能买到a碟吗 编辑:程序博客网 时间:2024/06/14 20:11
简介题意:
http://acm.scu.edu.cn/soj/problem.action?id=2222
一个游戏,里面有多种水果,每种水果可以加hp和score。先加满缺失的hp才可以加score,所以给出几个水果,怎样达到最后得到score最大。
反过来看,hp加满才加score,那么使得hp加满/溢出的最小score和正是我们所需,因为sumscore是一定的,用于hp消耗的score越小,则用于加分的score越多。
(所需hp1~1000,水果hp1~10000,水果score1~10000)
所以列出式子:
用因为题目中水果的hp属性最大为10000,所以最大满足题意的所有水果hp之和应该是hp+10000(因为要至少补满血为hp,再加上最大值10000,所有满足题意加满hp水果都包含在内)
scorenow[j]表示相加血量为j的水果、的最小score和(有点绕口,就是hp相加为j的水果们,这些水果的score之和达到最小时候,score是多少)
for(int i = 0; i < species ;i++) for(int j = hp+10010; j >= food[i][0]; j--) { scorenow[j] = min(scorenow[j], scorenow[j-food[i][0]] + food[i][1]); if(scorenow[j] < minfscore && j >= hp) minfscore = scorenow[j];}
scorenow[j-food[i][0]]+food[i][1] 表示,没有算上这个水果的score+本水果的score。scorenow[j]则表示已经加上本水果的score,而j血量也已经包含了本水果的hp。
所以注意!!!scorenow[j] 的意思是血量j算上了food[i],第i个水果,这些hp加起来为 j 的水果的score之和。
这两种就是讨论hp之和一定为j的时候,那些水果的score之和更小一点就要哪个
之后我们判断 j>=hp,满足题意的情况下,最小的minfscore,消耗score最小的水果用来加hp,可以得到更高的分数。
也可以写成:
for(int i = 0; i < species ;i++) for(int j = hp;j >= 0;j--) scorenow[j + food[i][0]]=min(scorenow[j + food[i][0]], scorenow[j] + food[i][1]); for(int i = hp; i <= hp+10010;i++) minfscore = min(scorenow[i],minfscore);
这样看也许更简单明了。scorenow[j+food[i][0]] 当前血量再吃一个food[i]加血的时候,这个时候的score值(此时是scorenow是已经加上了本水果的搜查人的!!!!)。和直接 j 血量,把food[i]加分的socre值,哪个更小就要哪个。
这种水果来加血则浪费的score(用来补血,所以浪费score)=(当前这个血量的最小消耗score 或者 血量就差本水果的hp,再加上本水果之后浪费的score)哪种分小
- soj2222_01背包变形
- 变形的背包问题
- HDU1114 完全背包变形
- poj3628(背包变形)
- hdu3033 分组背包变形
- poj 2184 背包变形
- 多重背包变形--poj1742
- 多重背包变形--poj2392
- hdu2955 01背包变形
- HDU2955 01 背包变形
- poj3211-01背包变形
- 01背包变形
- poj2184(01背包变形)
- hdu3033(分组背包变形)
- 01背包的变形
- 背包问题的变形
- 背包方案及变形
- 【01背包变形】 饭卡
- File类以及文件过滤器
- Online Object Tracking : A Benchmark 翻译
- chenw Hibernate 缓存机制
- Python小记--二进制方式文件读写实践
- Matlab编写乐曲
- soj2222_01背包变形
- 小白入门---CSS3新属性
- 机器学习实战笔记4
- 1015. 德才论 (25)
- BZOJ 3730 震波
- 【NOIP提高组模拟A组8.15】膜法师 (Standard IO)
- 学生管理系统总结
- 项目用到的一个资源管理类
- redis数据类型