1 条题解
-
3
二维费用背包模板,显然每个物品有两个属性,一个是它消耗的精灵球数量,一个是它会造成的伤害。所以这是一个二维费用背包了,每个宠物要么收复一次,要么不收复。所以是。
按照背包的写法写二维就可以了,题目说还要求最大的剩余体力,求最大剩余体力我们枚举一遍所有的状态,当前状态如果和最终答案相等,然后再去求解最大剩余体力即可。
cin >> n >> m >> c; for (int i = 1; i <= c; i++) cin >> a[i].num >> a[i].damage; for (int i = 1; i <= c; i++) // 先枚举物品个数 { for (int j = n; j >= a[i].num; j--) // 01 倒序枚举 球的数量 { for (int k = m; k >= a[i].damage; k--) // 倒叙枚举 伤害 { dp[j][k] = max(dp[j][k], dp[j - a[i].num][k - a[i].damage] + 1); // 转移 } } } cout << dp[n][m] << " "; ans = 0; for (int i = 0; i <= n; i++) { for (int j = 0; j <= m; j++) { if (dp[i][j] == dp[n][m]) // 如果dp[i][j] 和最终答案一样,就保证收集的精灵球个数一样。 { ans = max(ans, m - j); // 求解剩余体力,也就是 m - j } } } cout << ans;
- 1
信息
- ID
- 174
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 110
- 已通过
- 22
- 上传者