ZOJ刷题1013 C++

        题目一开始介绍了挺过故事背景的,但是身为一个无情的刷题机器人还是都跳过去了没怎么看。好像大概是意思是公主要救国王,于是要进行一场诺曼底登陆。现在我们要用船运三种装备,问这么运使得装备防御力最大化。

题目

有三种装备(头盔,护甲,鞋子),他们有重量,大小,防御力。分别记为S,W,D

然后三种装备个C1,C2,C3个可以组成套装,套装防御力会比原来的大(原来的防御力不在计算)

然后船有载重和空间。

求最多可以运达多少防御力。

输入格式为

n               //船的数量,若输入0表示结束

w1,s1,d1    //头盔的重量,占地大小,防御力

w2,s2,d2   //护甲的重量,占地大小,防御力

w3,s3,d3   //鞋子的重量,占地大小,防御力

c1,c2,c3,d4   //组成套装需要c1个头盔,c2个护甲,c3个鞋子。套装防御力d4

D1,S1     //第一艘船的载重,空间

D2,S2     //第一艘船的载重,空间

..........      //其他船的载重,空间

 

解题

       这道题的重点是如何拿装备的问题,对于任何以知两个装备的数量,则第三个装备的数量是唯一固定的。所以我们可以用一个二维数组来存储装备的选择,记为dp[i][j]=x。其中i为头盔的数量,j为护甲的数量,x则是鞋子的数量。对于船,因为他只有两个属性,我们可以构建一个car[2][n]的数组来存储,其中car[0]表示船的载重, car[1]表示空间。car[?][x]表示第几艘。

对于任意一辆车j,他可以拿的头盔是最大数量是

min(car[0][j]/w1,car[1][j]/s1)。因此对于所有车,我们可以知道装备i可以携带的最大值,如下公式。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值