题目大意:
mxy 沉迷于一个辣鸡游戏不可自拔。
为了加强角色的实力,mxy 决定重新买一套装备。已知现在有 n 件装备,每件装备会
ᨀ供一定的物理抗性和魔法抗性,并需要一定的价钱。mxy 想要保证至少有 a 的物抗和 b
的魔抗,请你计算出满足条件所需的最少金额。(装备不可重复购买)
解题思路:
f[i,j]表示物抗为i魔抗为j时最小的金额数。
对当前(ai,bi,mi)f[i+ai,j+bi]=min{f[i,j]+mi};
如果i+ai大于A,则将f[i+ai]更新到f[a]中去,j同理。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1005;
int a, b, n;
int w[N], m[N], v[N], f[105][105];
int main() {
scanf("%d %d\n%d", &a, &b, &n);
for (int i = 1; i <= n; ++i)
scanf("%d %d %d", &w[i], &m[i], &v[i]);
memset(f, 127 / 3, sizeof f);
f[0][0] = 0;
for (int i = 1; i <= n; ++i)
for (int j = a; j >= 0; --j)
for (int k = b; k >= 0; --k) {
int x = j + w[i];
int y = k + m[i];
x = min(x, a); y = min(y, b);
f[x][y] = min(f[x][y], f[j][k] + v[i]);
}
printf("%d", f[a][b]);
}