#include using namespace std; const int N = 12010, M = 2010; int n, m; int v[N], w[N]; int f[M]; //多重背包的二进制优化 int main() { //优化输入 ios::sync_with_stdio(false); cin >> n >> m; int cnt = 0; for (int i = 1; i <= n; i++) { int a, b, s; cin >> a >> b >> s; //二进制优化,能打包则打包之,1,2,4,8,16,... int k = 1; while (k <= s) { cnt++; v[cnt] = a * k; w[cnt] = b * k; s -= k; k *= 2; } //剩下的 if (s > 0) { cnt++; v[cnt] = a * s; w[cnt] = b * s; } } n = cnt; //数量减少啦 // 01背包 for (int i = 1; i <= n; i++) for (int j = m; j >= v[i]; j--) f[j] = max(f[j], f[j - v[i]] + w[i]); cout << f[m] << endl; return 0; }