分析:
皮卡丘体力值 -> M v1[]
精灵球数量 -> N v2[]
小精灵的数量 -> K
状态表示:f[I, j , k]: 前i个物品中,消耗的体力不超过j, 使用的精灵球数量不超过k ,能够捕获的最大精灵数量。
状态计算:
f[I, j, k] = max(f[I - 1, j - v1[i], k - v2[i]] + 1, f[I, j, k])
答案:
最多收服的精灵数量: f[K, M - 1, N]
当前消耗的最小体力: f[K, m, N] == f[K, M - 1, N]
从小到大枚举m,找到满足上式的最小m
代码:
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1010;
int v1[N], v2[N], f[N][N];
int main()
{
int N, M, K; cin >> N >> M >> K;
for(int i = 1; i <= K; ++i)
cin >> v1[i] >> v2[i];
for(int i = 1; i <= K; ++i)
for(int j = N; j >= v1[i]; --j)
{
for(int k = M - 1; k >= v2[i]; --k)
f[j][k] = max(f[j][k], f[j - v1[i]][k - v2[i]] + 1);
}
cout << f[N][M - 1] <<" ";
for(int i = 0; i <= M; ++i)
if(f[N][M - 1] == f[N][i] && N )
{
cout << M - i <<endl;
break;
}
return 0;
}
对!看起来字很有特点,配上这个背景显示效果很不错
谢谢
这个字好好看
谢谢