#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
long long max(long long a,long long b){
if (a>b) return a;else return b;
}
long long n,v,i,k,j,vs[201],value[201],many[201];//数组开大一点!!
long long f[200001];
long long t=1,temp_vs,temp_value,temp_many;
int main(){
scanf("%lld%lld",&n,&v);
int n1=0;
for (i=1;i<=n;i++){
scanf("%lld%lld%lld",&temp_vs,&temp_value,&temp_many);
if (temp_many!=-1){
while (temp_many>=t){
vs[++n1] = temp_vs * t;
value[n1] = temp_value * t;
many[n1] = 1;
temp_many-=t;
t*=2;
//printf("=%lld %lld %lld %lld\n",vs[n1],value[n1],many[n1],n1);
//printf("=========================%lld\n",v);
}
if (temp_many>0){
vs[++n1] = temp_vs * temp_many;
value[n1] = temp_value * temp_many;
many[n1] = 1;
//printf("=%lld %lld %lld %lld\n",vs[n1],value[n1],many[n1],n1);
//printf("=========================%lld\n",v);
}
}else{
vs[++n1] = temp_vs;
value[n1] = temp_value;
many[n1] = temp_many;
//printf("=%lld %lld %lld %lld\n",vs[n1],value[n1],many[n1],n1);
//printf("=========================%lld\n",v);
}
}
for (i=1;i<=n1;i++){
if (many[i]==-1){
//完全背包
for (j=vs[i];j<=v;j++)f[j] = max(f[j],f[j-vs[i]]+value[i]);
}
else{
//01背包 多重背包
for (k=v;k>=vs[i];k--)f[k] = max(f[k],f[k-vs[i]]+value[i]);
}
}
//for (i=1;i<=v;i++) printf("prices:%lld %lld\n",i,f[i]);
printf("%lld",f[v]);
return 0;
}
#include<iostream>
#include<cstring>
using namespace std;
long long max(long long a,long long b){
if (a>b) return a;else return b;
}
long long n,v,i,k,j,vs[201],value[201],many[201];//数组开大一点!!
long long f[200001];
long long t=1,temp_vs,temp_value,temp_many;
int main(){
scanf("%lld%lld",&n,&v);
int n1=0;
for (i=1;i<=n;i++){
scanf("%lld%lld%lld",&temp_vs,&temp_value,&temp_many);
if (temp_many!=-1){
while (temp_many>=t){
vs[++n1] = temp_vs * t;
value[n1] = temp_value * t;
many[n1] = 1;
temp_many-=t;
t*=2;
//printf("=%lld %lld %lld %lld\n",vs[n1],value[n1],many[n1],n1);
//printf("=========================%lld\n",v);
}
if (temp_many>0){
vs[++n1] = temp_vs * temp_many;
value[n1] = temp_value * temp_many;
many[n1] = 1;
//printf("=%lld %lld %lld %lld\n",vs[n1],value[n1],many[n1],n1);
//printf("=========================%lld\n",v);
}
}else{
vs[++n1] = temp_vs;
value[n1] = temp_value;
many[n1] = temp_many;
//printf("=%lld %lld %lld %lld\n",vs[n1],value[n1],many[n1],n1);
//printf("=========================%lld\n",v);
}
}
for (i=1;i<=n1;i++){
if (many[i]==-1){
//完全背包
for (j=vs[i];j<=v;j++)f[j] = max(f[j],f[j-vs[i]]+value[i]);
}
else{
//01背包 多重背包
for (k=v;k>=vs[i];k--)f[k] = max(f[k],f[k-vs[i]]+value[i]);
}
}
//for (i=1;i<=v;i++) printf("prices:%lld %lld\n",i,f[i]);
printf("%lld",f[v]);
return 0;
}