题意:在给定的时间内,选择做几种菜肴,然后让美味度最大
题解:第一眼01背包,然后再看,额,比01背包还多了个条件,就是,在不同的时间内做出来的菜,美味度会有变化,答案还可能负的(负的还能吃吗???,弥天大雾)
所以就是先进行贪心,把给定的数列处理成可以01背包的数列
既然是贪心,那么肯定图片说明 ,所以假设有图片说明 两种菜,那么选个菜就是图片说明图片说明两式相减,求贪心,化简得到图片说明 ,然后就可以进行贪心图片说明 了.
下来01背包拉进去
时间复杂度:图片说明

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;

struct Node {
  long long a, b, c;
} q[N];

long long s[N], dp[N],ans=-99999999;

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] = -999999999;
  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++) ans= max(ans, dp[i]);
cout<<ans;
  return 0;
}