1022. 宠物小精灵之收服
题目描述
收服小精灵需要两个代价,精灵球和体力值,问满足以上数量限制下的能收服的物品数?
| f1-01背包+双重花费 |
基本分析
- 相比于常规01背包,变化在哪?限制条件是独立的两个维度
- 最大数量下对应的最小的体力怎么找?满足值相等的条件下,让k尽量的小
代码
#include <iostream>
#include <algorithm>
using namespace std;
int f[1010][510];
int n, V1, V2;
int main()
{
scanf("%d%d%d", &V1, &V2, &n);
for (int i = 1; i <= n; i ++)
{
int v1, v2;
scanf("%d%d", &v1, &v2);
for (int j = V1; j >= v1; j --)
for (int k = V2-1; k >= v2; k--)
f[j][k] = max(f[j][k], f[j-v1][k-v2] + 1);
}
printf("%d ", f[V1][V2-1]);
int k = V2 - 1;
while (k > 0 & f[V1][k - 1] == f[V1][V2 - 1]) k --;
printf("%d\n", V2 - k);
return 0;
}
总结
- 体力值不能为空,所以遍历的时候,k从V2-1开始,取最大值的时候,也是f[V1][V2-1]

浙公网安备 33010602011771号