1022. 宠物小精灵之收服

题目描述

收服小精灵需要两个代价,精灵球和体力值,问满足以上数量限制下的能收服的物品数?

f1-01背包+双重花费

基本分析

  1. 相比于常规01背包,变化在哪?限制条件是独立的两个维度
  2. 最大数量下对应的最小的体力怎么找?满足值相等的条件下,让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;
}

总结

  1. 体力值不能为空,所以遍历的时候,k从V2-1开始,取最大值的时候,也是f[V1][V2-1]
posted @ 2023-03-30 14:08  zhangk1988  阅读(40)  评论(0)    收藏  举报