/*我遇到的动态规划问题不多,只能先利用0,1背包问题的初级解法来看,设置dp[n + 1][T + 1][H + 1]数组,三个维度上有一维是0则整体的值为0,这在初始化时候要做到,之后就是为数组赋值了,这里用到3层循环
dp数组的赋值逻辑是:if(event[i - 1][0] <= j && event[i - 1][1] <= k){
dp[i][j][k] = max(dp[i - 1][j][k], event[i - 1][2] + dp[i - 1][j - event[i - 1][0]][k - event[i - 1][1]]);
}
else{
dp[i][j][k] = dp[i - 1][j][k];
}
*/
#include <stdio.h>
#include <stdlib.h>
//max函数
long long max(long long a, long long b){
return a > b ? a : b;
}
int main(){
//读取数据
int n;
scanf("%d\n", &n);
int T, H;
scanf("%d %d\n", &T, &H);
long long **event = (long long **)malloc(sizeof(long long *) * n);
for(int i = 0; i < n; i++){
event[i] = (long long *)malloc(sizeof(long long) *3);
scanf("%lld %lld %lld\n", event[i], event[i] + 1, event[i] + 2);
}
//设置并初始化dp数组
long long ***dp = (long long ***)malloc(sizeof(long long ***) * (n + 1));
for(int i = 0; i < n + 1; i++){
dp[i]= (long long **)malloc(sizeof(long long **) * (T + 1));
for(int j = 0; j < T + 1; j++){
dp[i][j] = (long long *)malloc(sizeof(long long) * (H + 1));
}
}
for(int i = 0; i < T + 1; i++){
for(int j = 0; j < H + 1; j++){
dp[0][i][j] = 0;
}
}
for(int i = 0; i < n + 1; i++){
for(int j = 0; j < H + 1; j++){
dp[i][0][j] = 0;
}
}
for(int i = 0; i < n + 1; i++){
for(int j = 0; j < T + 1; j++){
dp[i][j][0] = 0;
}
}
//为dp数组赋值
for(int i = 1; i < n + 1; i++){
for(int j = 1; j < T + 1; j++){
for(int k = 1; k < H + 1; k++){
//状态转移方程实现
if(event[i - 1][0] <= j && event[i - 1][1] <= k){
dp[i][j][k] = max(dp[i - 1][j][k], event[i - 1][2] + dp[i - 1][j - event[i - 1][0]][k - event[i - 1][1]]);
}
else{
dp[i][j][k] = dp[i - 1][j][k];
}
}
}
}
//输出结果
printf("%lld\n", dp[n][T][H]);
//逐层释放空间
for(int i = 0; i < n; i++){
free(event[i]);
}
free(event);
for(int i = 0; i < n + 1; i++){
for(int j = 0; j < T + 1; j ++){
free(dp[i][j]);
}
free(dp[i]);
}
free(dp);
return 0;
}