#include <bits/stdc++.h>
using namespace std;
//由于要将物品拆分
int f[2020],v[15050],w[15050];
int op = 0;
int main() {
//二进制优化
//7:表示为0~7的和
//7分为:1 1 1 1 1 1 1,将7件物品分为7种物品
//二进制分法:2^2+2^1+2^0
//凑出一个整数Si的时间复杂度:log2(Si)
/*
如果要凑一个整数10
理论上需要log2(10)=4个数
但4个数1 2 4 8,不过会多凑一些数出来
但其实需要的数是: 1 2 4 3就能凑出0~10
也就是说:2^p是<=Si 2^p+1 > Si,求出一个p
这个p就是需要的数的数量
需要的最后一个数 = Si - (2^0+2^1+...+2^p)
*/
int n,m;
cin>>n>>m;
//拆分物品
for(int i = 1;i <= n;i++){
int v1,w1,s;
cin>>v1>>w1>>s;
int k = 1;//k代表2的幂
while(k <= s){
v[++op] = v1 * k;
w[op] = w1 * k;
s -= k;
k *= 2;
}
//如果s还有值,说明s不是正好是2的整数次方
if(s){
v[++op] = v1 * s;
w[op] = w1 * s;
}
}
//转换为01背包
for(int i = 1;i <= op;i++){
for(int j = m;j >= v[i];j--){
f[j] = max(f[j],f[j-v[i]]+w[i]);
}
}
cout<<f[m];
return 0;
}
/**************************************************************
Problem: 1889
User: admin
Language: C++
Result: Accepted
Time:38 ms
Memory:2200 kb
****************************************************************/