#include <iostream>
#include <queue>
using namespace std;
#define NUM 100
struct Node
{
int weight;
int value;
int level;
int flag;
friend bool operator < ( Node a, Node b)
{
return a. value < b. value;
}
} ;
priority_queue< Node> priq;
void enQueue ( int weight, int value, int level, int flag, int n, int * best)
{
Node node;
node. weight = weight;
node. value = value;
node. level = level;
node. flag = flag;
if ( level == n)
{
if ( value > * best) * best = value;
return ;
}
else priq. push ( node) ;
return ;
}
int knapsack ( int w[ ] , int v[ ] , int c, int n, int * best)
{
Node live;
live. weight = 0 ;
live. value = 0 ;
live. level = 0 ;
live. flag = 0 ;
priq. push ( live) ;
do
{
if ( live. weight+ w[ live. level] <= c)
{
enQueue ( live. weight + w[ live. level] , live. value + v[ live. level] ,
live. level + 1 , 1 , n, best) ;
}
enQueue ( live. weight, live. value, live. level + 1 , 0 , n, best) ;
live = priq. top ( ) ;
priq. pop ( ) ;
}
while ( ! priq. empty ( ) ) ;
return 0 ;
}
int main ( )
{
int w[ NUM] ;
int v[ NUM] ;
int c;
int n;
while ( scanf ( "%d%d" , & c, & n) != EOF )
{
for ( int i= 0 ; i< n; i++ )
scanf ( "%d%d" , & w[ i] , & v[ i] ) ;
int best= 0 ;
knapsack ( w, v, c, n, & best) ;
printf ( "%d\n" , best) ;
}
return 0 ;
}