题意

件食材(每种食材的数量可以视为无限),小明连续工作 时间。每道菜肴的制作需要特定的一种食材以及一段时间,但是食材一旦放久就不新鲜了,菜的美味值会降低。第 道菜肴有三个属性 是该菜肴的美味值, 是该菜肴所选食材不新鲜的速率,如果在第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;
}