- 何日目にどの問題を解いているかというDPです
- この解答ではダイクストラ法チックに解いています
int B[512];
int A[512];
int Bs[512][512];
int As[512][512];
int main()
{
int M, P;
cin >> M >> P;
for (int i = 0; i < P; ++i) {
cin >> B[i] >> A[i];
}
memset(Bs, 0, sizeof(Bs));
memset(As, 0, sizeof(As));
for (int i = 0; i < P; ++i) {
for (int j = i + 1; j <= P; ++j) {
As[i][j] = As[i][j - 1] + A[j - 1];
Bs[i][j] = Bs[i][j - 1] + B[j - 1];
}
}
vector<vector<int> > dp(P + 1, vector<int>(P + 1, INT_MAX / 2));
dp[0][0] = 1;
deque<pair<int, int> > q;
q.push_back(make_pair(0, 0));
while (!q.empty()) {
const int from = q.front().first;
const int to = q.front().second;
q.pop_front();
int cost = As[from][to];
for (int i = to; i <= P && cost <= M; ++i) {
if (dp[to][i] > dp[from][to] + 1) {
q.push_back(make_pair(to, i));
dp[to][i] = dp[from][to] + 1;
}
cost += B[i];
}
}
cout << dp[P][P] << endl;
}