2025-09-09 21:27:46 +09:00

44 lines
975 B
C

#include <stdio.h>
#include <stdlib.h>
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;
}