#include <stdio.h>
#include <algorithm>
using namespace std;
struct good{
int t;//时间
int v;//价值
}me[101];
int dp[1001];//状态数组
int main(){
int t,n;//时间 数量
while(scanf("%d%d",&t,&n)!=EOF){
for(int i=1;i<=n;i++)
scanf("%d%d",&me[i].t,&me[i].v);
for(int i=0;i<=t;i++)
dp[i]=0;//初始化,初始没有物品时总体积不超过j时最大价值为0
for(int i=1;i<=n;i++)
for(int j=t;j>=me[i].t;j--)//对s到good[i].w之间的任何一个j转移来源为dp[i-1][j]或dp[i-1][j-good[i].w]+good[i].v,取其中较大者
dp[j]=max(dp[j],dp[j-me[i].t]+me[i].v);
printf("%d\n",dp[t]);
}
return 0;
}
70 3
71 100
69 1
1 2