#include <iostream>using namespace std;class PackSolver { static const int MAXN = 1000 + 5; struct Node { int pos, val; } q[MAXN]; int dp[MAXN] = {}; int N, V; void zeroOnePack(int v, int w) { for (int i = V; i >= v; i--) dp[i] = max(dp[i], dp[i - v] + w); } void completePack(int v, int w) { for (int i = v; i <= V; i++) dp[i] = max(dp[i], dp[i - v] + w); } // 多重背包 N*V void multiPack(int v, int w, int s) { for (int i = 0; i < v; i++) { int hh = 0, tt = 0, stop = (V-i)/v; for (int k = 0; k <= stop; k++) { int val = dp[k*v+i] - k * w; while (hh < tt && q[tt - 1].val <= val) tt--; if (hh < tt && k - q[hh].pos > s) hh++; q[tt].val = val, q[tt++].pos = k; dp[k*v+i] = q[hh].val + k*w; } } } // 多重背包 N*V*LogS void multiPack(int v, int w, int s, bool) { for (int i = 1; i <= s; s -= i, i *= 2) zeroOnePack(v * i, w * i); if (s) zeroOnePack(v * s, w * s); }public: void f() { cin >> N >> V; int v, w, s; while (N--) { cin >> v >> w >> s; if (s == -1) zeroOnePack(v, w); else if (s == 0) completePack(v, w); else multiPack(v, w, s); } cout << dp[V] << endl; }};int main() { PackSolver s; s.f();}