//本次将讨论0/1背包的空间优化问题。
//这是未优化的。显然数组开不大。
#include <stdio.h>
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
int main()
{
int t,m;
int v[101],c[101],f[101][1001];
int i,r;
scanf("%d%d",&t,&m);
for(i=1;i<=m;i++) scanf("%d%d",&c[i],&v[i]);
for(r=0;r<=t;r++) if(r<c[1]) f[1][r]=0; else f[1][r]=v[1];
for(i=2;i<=m;i++)
for(r=0;r<=t;r++)
if(r>=c[i])
f[i][r]=max(f[i-1][r],f[i-1][r-c[i]]+v[i]);
else
f[i][r]=f[i-1][r];
printf("%d",f[m][t]);
return 0;
}
/*------------------------华丽丽----------------------------*/
//优化过的。
//事实上f[i][r]一开始用的还是f[i-1][r]的值,因此实际上只需要一个数组。
#include <stdio.h>
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
int main()
{
int t,m;
int v[101],c[101],f[1001];
int i,r;
scanf("%d%d",&t,&m);
for(i=1;i<=m;i++) scanf("%d%d",&c[i],&v[i]);
for(r=0;r<=t;r++) if(r<c[1]) f[r]=0; else f[r]=v[1];
for(i=2;i<=m;i++)
//关键!为保证本次所需要的未用数据不改变,令r递减。
for(r=t;r>=0;r--)
if(r>=c[i])
f[r]=max(f[r],f[r-c[i]]+v[i]);
else
f[r]=f[r];
printf("%d",f[t]);
return 0;
}