师姐问了我一个二维背包问题, 傻眼了,之前没写过, 好在参考了老哥代码 T1292:宠物小精灵之收服 后给写出来了。作者使用c, 我使用cpp, 并且使用了STL, 更加省空间。
题目大家看那个作者的链接吧。
struct 不熟悉的同学可看: cpp极简入门——结构体_(7)
STL 不熟悉的同学可看: STL常用操作
#include#include using namespace std; struct Pet{ int ball; // 精灵球 int hp; // 体力 }; int main() { unordered_map pet; unordered_map > dp; int n, m, t; // 小智的精灵球数量n 皮卡丘初始的体力值m // 野生小精灵的数量t cin >> n >> m >> t; for (int i = 1;i <= t; i++) cin >> pet[i].ball >> pet[i].hp; for (int i = 1; i <= t; i++) { // 遍历每一只精灵 for (int j = n; j >= pet[i].ball; j--) { for (int k = m; k >= pet[i].hp; k--) dp[j][k] = max(dp[j][k], dp[j - pet[i].ball][k - pet[i].hp] + 1); } } bool flag = true; // 看看哪里可以消耗最少的皮卡丘体力 for (int i = 1; i < m; i++) { // i <= m错了吧; 皮卡丘小于0不能捕捉 if (dp[n][i] == dp[n][m]) { cout << dp[n][i] << " " << m - i << endl; flag = false; break; } } // 没法捕获 if (flag) cout << 0 << " " << m << endl; }



