#include #include int max(int a, int b) { return a>b ? a : b; } int main() { int N, K; scanf("%d %d",&N, &K); int** items = (int**)malloc(sizeof(int*)*(N+1)); int** dp = (int**)malloc(sizeof(int*)*(N+1)); for(int i=0; i<=N; i++) { items[i] = (int*)malloc(sizeof(int)*2); if(i==0) { items[i][0] = 0; items[i][1] = 0; } else { scanf("%d %d",&items[i][0], &items[i][1]); } dp[i] = (int*)malloc(sizeof(int)*(K+1)); for(int j=0; j<=K; j++) dp[i][j] = 0; } for(int n=1; n<=N; n++) { for(int k=1; k<=K; k++) { if (items[n][0] <= k) dp[n][k] = max(dp[n-1][k], dp[n-1][k-items[n][0]] + items[n][1]); else dp[n][k] = dp[n-1][k]; } } printf("%d\n",dp[N][K]); for(int i=0; i<=N; i++) { free(items[i]); free(dp[i]); } free(items); free(dp); return 0; }