//普通的01背包问题  
//注意状态转移方程的写法   
//时间够:  装与不装    dp[i][j]=max(dp[i-1][j],dp[i-1][j-times[i]]+weight[i])
//时间不够:   当前状态由 没有遍历到该物品时的最大价值相同
#include<iostream>
#include<math.h>
using namespace std;
int dp[101][1001];//dp[i][j] 表示在j时间内有i件草药的前提下能采摘的最大价值。
int times[1001];
int weight[101];
int main(){
    int T,M;
    cin>>T>>M;
    for(int i=1;i<=M;i++){
        cin>>times[i]>>weight[i];
    }
    for(int i=1;i<=M;i++){  //第i件草药
        for(int j=1;j<=T;j++){  //j时间内
            if(j>=times[i]){
                dp[i][j]=max(dp[i-1][j],dp[i-1][j-times[i]]+weight[i]);
            }else{
                dp[i][j]=dp[i-1][j];
            }
        }
    }
    cout<<dp[M][T];
    return 0;
}