递归搜索所有的选法的取值。
定义递归函数dfs(u,cnt,s),表示当前搜索到第u个小精灵,已经收服了cnt个小精灵,皮卡丘当前的体力为s。
对于当前这个小精灵,有两种选择:收服或离开。
如果选择收服,那么精灵球数量会减少,皮卡丘的体力也会减少,同时收服的小精灵数量加1。
如果选择离开,那么精灵球数量不变,皮卡丘的体力也不会减少,但是小精灵数量不会增加。
递归边界为:当精灵球数量为0或者皮卡丘体力小于等于0时,递归结束。
每次递归时,更新答案C和R,并尝试收服下一个小精灵(即dfs(u+1,cnt+1,s-hp))或者离开下一个小精灵(即dfs(u+1,cnt,s))。
每个小精灵的收服或离开都可以看做是一个状态,因此可以用递归搜索进行枚举,求得最终的答案。
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 25; int n, m, k; int w[N], t[N]; int ans, res; // dfs(u, cnt, rest): u 表示当前考虑的小精灵编号,cnt 表示已经收服的小精灵数量,rest 表示皮卡丘剩余的体力值。 void dfs(int u, int cnt, int rest) { if (u == k) // 边界情况,搜索到小精灵数量的最大值,退出递归 { if (cnt > ans) // 如果当前收服的小精灵数量比已经搜索到的最大值还大,更新答案 { ans = cnt; res = rest; // 更新皮卡丘的剩余体力值 } else if (cnt == ans) // 如果当前收服的小精灵数量等于已经搜索到的最大值,比较皮卡丘的剩余体力值,更新更大的那个 { res = max(res, rest); } return; } if (rest <= 0) return; // 如果皮卡丘已经没有体力了,返回 dfs(u + 1, cnt, rest); // 不捕捉当前小精灵,直接搜索下一个小精灵 if (w[u] <= n) dfs(u + 1, cnt + 1, rest - t[u]); // 捕捉当前小精灵,更新收服小精灵的数量和皮卡丘的体力值 } int main() { cin >> n >> m >> k; for (int i = 0; i < k; i ++ ) cin >> w[i] >> t[i]; dfs(0, 0, m); // 从第一个小精灵开始搜索,当前还没有收服任何小精灵,皮卡丘还有 m 点体力。 cout << ans << " " << m - res << endl; // 输出最大收服小精灵数量和此时皮卡丘的剩余体力值 return 0; }
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647揭露题目本质:
精灵球个数 - 背包的体积;#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 1e3+10, M = 5e2+10, K = 1e2 + 10; int f[N][M]; //表示从前i件物品里面选,花费一不超过j,花费2不超过k的选法的最大价值。 int n, m, k; int main() { cin >> n >> m >> k; for (int i=0; i < k; i ++) //k只小精灵! { int v1, v2, w; cin >> v1 >> v2; //花费1和花费2! for (int j=n; j >= v1; j --) //倒推! { for (int p=m-1; p>=v2; p--) { f[j][p] = max(f[j][p], f[j-v1][p-v2] + 1); } } } cout << f[n][m-1] << " "; int res=m-1; //求最大数量不变的情况下,皮卡丘的体力值的最大可以保留多少! while (res > 0 && f[n][res-1] == f[n][m-1]) res --; cout << m - res << endl; return 0; }
123456789101112131415161718192021222324252627282930313233343536相关知识
宠物小精灵之收服 【暴搜+DP+代码注释+详细思路=包掌握】
宠物小精灵之收服
Bailian4102 宠物小精灵之收服【模拟】
洛谷 U266184 宠物小精灵之收服
宠物小精灵之收服(二维背包)
写出宠物小精灵之收服问题的伪代码
AcWing 1022 宠物小精灵之收服
【动态规划】宠物小精灵之收服
C++解决:宠物小精灵之收服【oj】
1292:宠物小精灵之收服
网址: 宠物小精灵之收服 【暴搜+DP+代码注释+详细思路=包掌握】 https://m.mcbbbk.com/newsview725618.html
上一篇: 宠物小精灵之收服(二位费用问题) |
下一篇: Acwing.提高课.宠物小精灵 |