1 /*
2 * 0/1背包
3 */
4 #include <cstdio>
5 #include <cstring>
6 #include <iostream>
7
8 using namespace std;
9
10 const int M = 30;
11 const int N = 30005;
12
13 int f[N];
14 struct pack {
15 int cost;
16 int value;
17 }p[M];
18
19 void ZeroOnePack(int n, int cost, int value) {
20 for (int i=n; i>=cost; --i) {
21 if (f[i] < f[i-cost]+value) f[i] = f[i-cost] + value;
22 }
23 }
24
25 int dp(int n, int m) {
26 memset(f, 0, sizeof(f));
27 for (int i=0; i<m; ++i) {
28 ZeroOnePack(n, p[i].cost, p[i].value);
29 }
30 return f[n];
31 }
32
33 int main() {
34 int n, m, d;
35 while (scanf("%d%d", &n, &m) != EOF) {
36 for (int i=0; i<m; ++i) {
37 scanf ("%d%d", &p[i].cost, &d);
38 p[i].value = p[i].cost * d;
39 }
40 int ans = dp(n, m);
41 printf ("%d\n", ans);
42 }
43 return 0;
44 }