c++题目如下:题目背景 你是一位站在顶峰独孤求败的神犇,由于你做题太快了,大家都是远远得仰望着你,但是你也向往着蒟蒻的阵营,那里的人个个都是人才,说话又好听,所以你决定,在一次模拟赛中降低速度,且不想拿太高的分数(不考0分,不然会引起蒟蒻们的怀疑)。 题目描述 你想本次模拟赛在自己得分不超过m的情况下,使得做题的时间更久。(只计算做题的时间,不计算其他的时间) 输入格式 输入的第一行是用空格隔开的两个整数,分别代表题目个数 n,不能超过的得分 m。 第 2 到第 (n+1) 行,每行两个用空格隔开的整数,第(i+1) 行的整数 pi,ti 分别代表解决第 i 题得到的分数 和 花费的时间。 输出格式 输出一行一个整数,代表最久的做题时间。 输入输出样例 输入 #1 4 300 100 60 250 120 120 100 35 20 输出 180 请问c++代码是什么
时间: 2024-02-05 10:11:04 浏览: 248
第十五届蓝桥杯大赛软件赛省赛C++B组题目
以下是题目的C++代码实现:
```cpp
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;
struct Problem {
int score, time;
} p[N];
int n, m;
int f[N][N * 10];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> p[i].score >> p[i].time;
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= m; j++) {
f[i][j] = f[i - 1][j];
if (j >= p[i].score) {
f[i][j] = max(f[i][j], f[i - 1][j - p[i].score] + p[i].time);
}
}
}
int res = 0;
for (int i = 0; i <= m; i++) {
res = max(res, f[n][i]);
}
cout << res << endl;
return 0;
}
```
算法思路:
本题是一道 01 背包的变体,每一个物品要么不选,要么选一次,不能选多次。状态转移方程如下:
$$f_{i,j}=\max(f_{i-1,j}, f_{i-1,j-p_i.score}+p_i.time)$$
其中 $f_{i,j}$ 表示前 $i$ 道题目,得分不超过 $j$ 的最久做题时间。$p_i.score$ 和 $p_i.time$ 分别表示第 $i$ 道题目的得分和花费时间。
阅读全文