//首次接触背包问题,理解起来还是有点吃力!需要多练习!
#include "iostream"
#include "cmath"
using namespace std;
int total[26][300010];
int main()
{
int N, m;
while (cin >> N >> m)
{
int *price = new int[m+1];
int *degree = new int[m+1];
for (int i = 0; i <= m; i++)
for (int j = 0; j <= N; j++)
total[i][j] = 0;
for (int i = 1; i <= m; i++)
cin >> price[i] >> degree[i];
int ans = 0;
for (int i = 1; i <= m; i++)
for (int j = 1; j <= N; j++)
{
if (price[i] <= j)
{
if (total[i-1][j] < total[i-1][j-price[i]] + price[i] * degree[i])//动态规划的公式!要理解透,熟悉运用!
{
total[i][j] = total[i-1][j-price[i]] + price[i] * degree[i];
ans = max(total[i][j], ans);
}
else
{
total[i][j] = total[i-1][j];
ans = max(total[i][j], ans);
}
}
else
{
total[i][j] = total[i-1][j];
ans = max(total[i][j], ans);
}
}
cout << ans << endl;
}
}