#include #include #include using namespace std; ifstream input_stream; ofstream output_stream; int getMaxValue(int P[], int W[], int C, int N) { int table[2][C] = {0}; for (int i = 0; i < 2; i++) { for (int j = 0; j < C; j++) { table[i][j] = 0; } } for (int i = 0; i < N; i++) { int *topRow; int *bottomRow; if (i % 2 == 0) { topRow = table[0]; bottomRow = table[1]; } else { topRow = table[1]; bottomRow = table[0]; } if (1 >= W[i]) { bottomRow[0] = max(P[i] + topRow[1 - W[i]], bottomRow[1 - 1]); } else { bottomRow[0] = bottomRow[1 - 1]; } for (int w = 1; w < C; w++) { if (w + 1 > W[i]) { bottomRow[w] = max(P[i] + topRow[(w + 1) - W[i]], topRow[w]); } else { bottomRow[w] = topRow[w]; } for (int y = 0; y < 2; y++) { for (int x = 0; x < C; x++) { cout << table[y][x] << " "; } cout << endl; } // string tmp; // cin >> tmp; } } return max(table[0][C-1], table[1][C-1]); } int main() { input_stream.open("input.txt"); int N, C; input_stream >> N; input_stream >> C; int P[N]; int W[N]; for (int i = 0; i < N; i++) { input_stream >> W[i]; input_stream >> P[i]; } cout << getMaxValue(P, W, C, N) << endl; input_stream.close(); return 0; }