#include #include int max(int a, int b) { int v[2] = { a, b }; return v[b > a]; } int min(int a, int b) { int v[2] = { a, b }; return v[b < a]; } int ks[2001][2001], v[2000], w[2000]; bool t[2001][2001]; int main() { int c, n; while (scanf("%d %d", &c, &n) == 2) { for (int i = 0; i < n; i++) { scanf("%d %d", &v[i], &w[i]); } for (int j = 0; j < w[0] && j <= c; j++) { ks[0][j] = 0; t[0][j] = false; } for (int j = w[0]; j <= c; j++) { ks[0][j] = v[0]; t[0][j] = true; } for (int i = 1; i < n; i++) { for (int j = 0; j < w[i] && j <= c; j++) { ks[i][j] = ks[i - 1][j]; t[0][j] = false; } for (int j = w[i]; j <= c; j++) { int skip = ks[i - 1][j]; int take = ks[i - 1][j - w[i]] + v[i]; ks[i][j] = max(take, skip); t[i][j] = take > skip; } } int taken[2000]; int taken_count = 0; int j = c; for (int i = n - 1; i >= 0; i--) { if (t[i][j]) { taken[taken_count++] = i; j -= w[i]; } } printf("%d\n", taken_count); for (int i = taken_count - 1; i >= 0; i--) { printf("%d%c", taken[i], i == 0 ? '\n' : ' '); } } }