#include <iostream> using namespace std; #define MIN -99999 void print(int **path,int space[],int v,int i,int n) { if(i==n+1) { return; } cout<<path[v][i]<<endl; print(path,space,v-path[v][i]*space[i],i+1,n); } int getMaxHappy(int amount[],int happy[],int space[],int n,int v) { int **maxHappy=new int*[v+1]; int **path=new int*[v+1]; for(int j=0;j<v+1;++j) { maxHappy[j]=new int[n+2]; path[j]=new int[n+2]; maxHappy[j][n+1]=0; } for(int i=0;i<n+2;++i) { maxHappy[0][i]=0; } for(int i=1;i<v+1;++i) { for(int j=n;j>=1;--j) { path[i][j]=0; maxHappy[i][j]=MIN; for(int k=0;k<=amount[j];++k) { if(i-k*space[j]>=0) { int temp=happy[j]*k+maxHappy[i-k*space[j]][j+1]; if(temp>maxHappy[i][j]) { maxHappy[i][j]=temp; path[i][j]=k; } } else { break; } } } } int back=maxHappy[v][1]; print(path,space,v,1,n); for(int i=0;i<v+1;++i) { delete []maxHappy[i]; } delete []maxHappy; return back; } int main() { int n,v,*amount,*happy,*space; cin>>n>>v; amount=new int[n+1]; happy=new int[n+1]; space=new int[n+1]; for(int i=1;i<n+1;++i) { cin>>amount[i]>>happy[i]>>space[i]; } cout<<getMaxHappy(amount,happy,space,n,v); return 0; }