#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
int n, m;
int f[N];
int main()
{
cin >> m >> n;
for(int i = 1; i <= n; i++)
{
int v, w;
cin >> v >> w;
for(int j = m; j >= v; j--)
{
f[j] = max(f[j], f[j - v] + w);
}
}
cout << f[m] << endl;
return 0;
}
/*
这里举个例子;
原本是f(i, j)两维表示的,但使用滚动数组可以优化为一维。
枚举第i组物品有选与不选两种情况,如果不选第i组物品,也就是
等价于在第1 ~ i-1组物品中选择,即f(i, j) = f(i-1, j);
如果选择第i组物品:
1, ..., k1, ... , i
1, ..., k2, ... , i
.........
1, ..., k1, ... , i
则就是看前i(不包含第i个物品)个物品中选法的最大值,再加第i个
物品的最大值
*/