HDU-2159 FATE 完全背包

参考资料:https://blog.csdn.net/chen_ze_hua/article/details/51669239
题意:

升级还需n点经验值,还有m点忍耐度,杀一个怪会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,最多只杀s只怪。能升级,输出最大剩余耐久。不能升级,输出-1。

完全背包概述:

有N种物品和一个容量为V的背包,每种物品都有无限件可用。

第i种物品的体积是c,价值是w。求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大。

背包思想:

明确:在给定忍耐度下,杀掉给定只怪物,希望得到最大价值

对应:怪物 —— 物品

          给定忍耐度、给定怪物 —— 体积(背包容量)

解题思路:

0.读入数据,并初始化相关数组(清零)

1.首先,枚举物品(怪物,即k)

2.然后,根据完全背包问题,枚举限制条件1(装备耐久度,即m)(递增枚举)

3.接着,枚举限制条件2(杀怪数量,即s)

至此,我们得到了dp数组,dp[m][s]表示用m点忍耐度杀死s只怪所能获得的最大经验值。

4.最后,从(1,1)→(m,s)扫一遍dp数组,得到第一个满足升级条件的m0值,输出m-m0

(利用flag标记,得到立即跳出循环输出,得不到输出-1)

核心代码:
for(int i = 0; i <= k; i++)
            for(int j = b[i]; j <= m; j++)
                for(int f = 1; f <= s; f++)
                    dp[j][f] = max(dp[j][f], dp[j-b[i]][f-1] + a[i]);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值