#include <iostream>
using namespace std;
int value,num;
int val[100],tim[100];
int MAX_Val;
int flag,temp;
int vis[100];
void dfs(int n)
{
if(n>num)
return ;
if(temp>value)
return ;
if(n==num&&MAX_Val<flag)
{
MAX_Val = flag;
}
for(int i=0;i<num;i++)
{
if(!vis[i])
{
temp+=tim[i];
flag+=val[i];
vis[i] = 1;
dfs(i+1);
vis[i] = 0;
temp-=tim[i];
flag-=val[i];
}
}
}
int main()
{
cin>>value>>num;
for(int i=0;i<num;i++)
{
cin>>tim[i]>>val[i];
}
MAX_Val = 0;
flag =0;temp=0;
dfs(0);
cout<<MAX_Val<<endl;
return 0;
}
#include<iostream>
# include<cstring>
# define max(a,b) a>b?a:b
using namespace std;
int main()
{
int dp[101][1001],m,T,w[101],val[101],i,j;
cin>>T>>m;
for(i=1;i<=m;i++)
cin>>w[i]>>val[i];
memset(dp,0,sizeof(dp));
for(i=1;i<=m;i++)
for(j=0;j<=T;j++)//j相当于上面说的V-c[i]
{
if(j>=w[i])
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+val[i]);//放还是不放的选择
else dp[i][j]=dp[i-1][j];
}
cout<<dp[m][T]<<endl;
return 0;
}