题意
件食材(每种食材的数量可以视为无限),小明连续工作 时间。每道菜肴的制作需要特定的一种食材以及一段时间,但是食材一旦放久就不新鲜了,菜的美味值会降低。第 道菜肴有三个属性 ,,, 是该菜肴的美味值, 是该菜肴所选食材不新鲜的速率,如果在第t时刻完成第i道菜则美味值为:,完成这道菜需要 的时间。求在这 时间内能做出菜肴使得总美味值的最大值。
solution
首先需要贪心确定顺序,考虑只有两道菜,可以得到:,化简后得到:。排序后背包即可(需要降维)。
Code
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll INF = 0x3ffffffffffff; const int N = 2e5 + 5; struct Node { ll a, b, c; } q[N]; ll res = -INF, s[N], dp[N]; bool cmp(Node x, Node y) { return x.c * s[y.a] < y.c * s[x.a]; } int main() { int n, m, t; cin >> n >> m >> t; for (int i = 1; i <= n; i++) cin >> s[i]; for (int i = 1; i <= m; i++) cin >> q[i].a >> q[i].b >> q[i].c; sort(q + 1, q + m + 1, cmp); for (int i = 1; i <= t; i++) dp[i] = -INF; for (int i = 1; i <= m; i++) for (int j = t; j >= q[i].c; j--) dp[j] = max(dp[j], dp[j - q[i].c] + q[i].b - j * s[q[i].a]); for (int i = 1; i <= t; i++) res = max(res, dp[i]); cout << res << '\n'; return 0; }