#include <iostream>
#include <string.h>
using namespace std;
int ans[2][13000];
int N, M;
int map[2][4000];
int min(int a, int b) {
if (a > b)
return a;
else
return b;
}
int main() {
memset(ans, -1, sizeof(ans));
cin >> N >> M;
for (int x = 1; x <= N; x++) {
cin >> map[0][x];
cin >> map[1][x];
}
for (int i = 0; i <= M; i++) {
if (i < map[0][N])
ans[0][i] = 0;
else
ans[0][i] = map[1][N];
}
for (int i = 2; i <= N; i++) {
if (i % 2 == 0) {
for (int j = 0; j <= M; j++) {
if (j < map[0][N - i + 1])
ans[1][j] = ans[0][j];
else
ans[1][j] = min(ans[0][j], map[1][N-i+1]+ans[0][j - map[0][N - i + 1]]);
}
}
else if (i % 2 == 1) {
for (int j = 0; j <= M; j++) {
if (j < map[0][N - i + 1])
ans[0][j] = ans[1][j];
else
ans[0][j] = min(ans[1][j], map[1][N - i + 1] + ans[1][j - map[0][N - i + 1]]);
}
}
}
int res = 0;
if (N % 2 == 0) {
res = ans[1][M];
}
else
res = ans[0][M];
cout << res << endl;
return 0;
}
[Coursera]算法基础_Week5_动态规划(2)_Q2
最新推荐文章于 2025-04-29 10:06:37 发布