1 #include <cstdio> 2 #include <cstring> 3 4 const int MAXN = 1e5+10; 5 6 bool dp[MAXN]; 7 int num[MAXN], val[MAXN]; 8 int l, n; 9 10 int main() 11 { 12 while (~scanf("%d%d", &l, &n)) { 13 int sum = 0; 14 for (int i = 1; i <= n; ++i) { 15 scanf("%d%d", num+i, val+i); 16 sum += num[i] * val[i]; 17 } 18 if (sum <= l) { 19 printf("%d ", sum); 20 continue; 21 } 22 memset(dp, false, sizeof dp); 23 dp[0] = true; 24 for (int i = 1; i <= n; ++i) { 25 for (int j = l; j >= 0; --j) { 26 if (true == dp[j]) { 27 for (int k = 1; k <= num[i]; ++k) { 28 if (j + k * val[i] > l) 29 continue; 30 dp[j + k * val[i]] = true; 31 } 32 } 33 } 34 } 35 int i; 36 for (i = l; i >= 1; --i) 37 if (true == dp[i]) 38 break; 39 printf("%d ", i); 40 } 41 return 0; 42 }