#include #include #include #include #include #include #include using namespace std; struct Data { int score = -100000000; int total_index = 0; vector zi; bool operator <(const Data & b) { if (score == b.score) { if (total_index == b.total_index) { return zi < b.zi; } return total_index < b.total_index; } return score > b.score; } }; int main() { cin.sync_with_stdio(0); cin.tie(0); cout.tie(0); // close sync between cout and printf int T; cin >> T; for (int ii=1; ii<=T; ++ii) { int n, budget; cin >> budget >> n; Data dp[10000]; dp[0].score = 0; int cost, score; for (int i = 1; i <= n; ++i) { cin >> score >> cost; for (int j = budget - cost; j >= 0; --j) { auto & a = dp[j]; auto & b = dp[j + cost]; if (a.score < 0) continue; if (a.score + score < b.score) continue; if (a.score + score == b.score) { if (a.total_index + i > b.total_index) continue; if (a.total_index + i == b.total_index) { vector z = a.zi; z.push_back(i); if (z >= b.zi) continue; } } auto v = a; v.score += score; v.total_index += i; v.zi.push_back(i); b = v; } } int ri = 0; for (int j = budget; j > 0; --j) { if (dp[j] < dp[ri]) ri = j; } cout << "Case #" << ii <<":"<< endl; cout << dp[ri].score << ' ' << ri << endl; auto & z = dp[ri].zi; if (z.size()) { cout << z[0]; for (int i = 1; i < z.size(); ++i) { cout << ' ' << z[i]; } cout << endl; } } return 0; }