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 @   zhangk1988  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示