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]);

猜你喜欢

转载自blog.csdn.net/gg9002/article/details/81031032