C++实现:北京大学数据结构与算法——宠物小精灵收服问题

需积分: 5 11 下载量 48 浏览量 更新于2024-09-14 1 收藏 787B TXT 举报
"这是一份关于C++编程的作业代码,源自北京大学数据结构与算法课程,题目名为‘宠物小精灵之收服’,是POJ(编程在线判题系统)上的一个问题。代码主要实现了求解如何用最大能力值收服指定数量的宠物小精灵,同时消耗最小的总能力值。" 在《宠物小精灵之收服》这个问题中,我们面临的是一个经典的动态规划问题。题目中给出了一些宠物小精灵,每个小精灵有不同的捕捉难度`u[i]`和对应的收服奖励`w[i] = 1000 - u[i]`。目标是找到一种策略,用不超过`V`的能力值收服恰好`U`个小精灵,使得总奖励最大化。 代码首先读入了小精灵的数量`k`,以及玩家的最大能力值`V`和需要收服的小精灵数量`U`。然后,使用三重循环来构建动态规划的二维数组`map`,其中`map[j][k]`表示在剩余能力值为`j`时,能收服`k`个小精灵的最大总奖励。 `memset(map,0,sizeof(map))`用于初始化`map`数组,确保所有元素初始值为0。接下来的三重循环通过比较`map[j][k]`和`map[j-v[i]][k-u[i]] + w[i]`来更新`map`数组,如果新的组合能够获得更高的总奖励,则进行更新。这里`v[i]`和`u[i]`分别代表当前小精灵的消耗和奖励,`map[j-v[i]][k-u[i]]`表示不收服当前小精灵时的最优解,加上`w[i]`就是收服后的总奖励。 当`map[V][U]`等于0时,表示无法完成任务,程序输出0并结束。否则,计算出最大的总奖励`num_max = map[V][U] / 1000 + 1`,以及在达到这个奖励时剩余的能力值`hp_max`,最后输出结果。 这段代码运用了动态规划的方法,通过自底向上的方式逐步构建解决方案,有效地解决了这个问题。动态规划是一种强大的工具,常用于解决最优化问题,尤其在处理具有重叠子问题和最优子结构的问题时效率显著。在这个案例中,每一步决策(是否收服某个小精灵)都基于之前所有更小规模问题的最优解,最终得到全局最优解。