测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A22017. 道具商店题目描术道具商店⾥有n件道具可供挑选。第i件道具可为玩家提升ai点攻击⼒,需要ci枚⾦币才能购买,每件道具只能购买一次。现在你有k枚⾦币,请问你最多可以提升多少点攻击⼒?

填空题 困难

题目描述

道具商店

题目描术

道具商店⾥有n件道具可供挑选。第i件道具可为玩家提升ai点攻击⼒,需要ci枚⾦币才能购买,每件道具只能购买一次。现在你有k枚⾦币,请问你最多可以提升多少点攻击⼒?

输入格式

第一行,两个正整数n,k,表示道具数量以及你所拥有的金币数量。

接下来n行,每行两个正整数ai,ci,表示道具所提升的攻击力点数,以及购买所需的金币数量。

输出格式

输出一⾏,一个整数,表⽰最多可以提升的攻击⼒点数。

样例

输入样例 1

3 5
99 1
33 2
11 3

输出样例 1

132

输入样例 2

4 100
10 1
20 11
40 33
100 99

输出样例 2

110

数据范围

对于60的测试点,保证1≤k≤500,1≤ci≤500。

对于所有测试点,保证1≤n≤500,1≤k≤109,1≤ai≤500,1≤ci≤109

参考答案

#include <cstdio> #include <algorithm> using namespace std; const int N = 505; const int oo = 1e9 + 10; int n, k; int f[N * N]; int main() { scanf("%d%d", &n, &k); for (int i = 1; i < N * N; i++) f[i] = oo; int s = 0; for (int i = 1; i <= n; i++) { int a, c; scanf("%d%d", &a, &c); s += c; for (int j = s; j >= a; j--) f[j] = min(f[j], f[j - a] + c); } int ans = 0; for (int i = 0; i < N * N; i++) if (f[i] <= k) ans = i; printf("%d\n", ans); return 0; }
上一题 下一题