#include<bits/stdc++.h>
using namespace std;
#define MAX 20000004
int mat[2][MAX],val[MAX],wt[MAX];
int KnapSack(int val[], int wt[], int n, int W)
{
// matrix to store final result
// iterate through all items
int i = 0;
while (i < n) // one by one traverse each element
{
int j = 0; // traverse all wieghts j <= W
// if i is odd that mean till now we have odd
// number of elements so we store result in 1th
// indexed row
if (i&1)
{
while (++j <= W) // check for each value
{
if (wt[i] <= j) // include element
mat[1][j] = max(val[i] + mat[0][j-wt[i]],
mat[0][j] );
else // exclude element
mat[1][j] = mat[0][j];
}
}
// if i is even that mean till now we have even number
// of elements so we store result in 0th indexed row
else
{
while(++j <= W)
{
if (wt[i] <= j)
mat[0][j] = max(val[i] + mat[1][j-wt[i]],
mat[1][j]);
else
mat[0][j] = mat[1][j];
}
}
i++;
}
// Return mat[0][W] if n is odd, else mat[1][W]
return (n&1)? mat[0][W] : mat[1][W];
}
int main()
{
ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int W,n,i;
cin>>W>>n;
for(i=0;i<n;++i)
cin>>val[i]>>wt[i];
cout << KnapSack(val, wt, n, W) ;
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBNQVggMjAwMDAwMDQKaW50IG1hdFsyXVtNQVhdLHZhbFtNQVhdLHd0W01BWF07CgppbnQgS25hcFNhY2soaW50IHZhbFtdLCBpbnQgd3RbXSwgaW50IG4sIGludCBXKQp7CiAgICAvLyBtYXRyaXggdG8gc3RvcmUgZmluYWwgcmVzdWx0CiAgICAvLyBpdGVyYXRlIHRocm91Z2ggYWxsIGl0ZW1zCiAgICBpbnQgaSA9IDA7CiAgICB3aGlsZSAoaSA8IG4pIC8vIG9uZSBieSBvbmUgdHJhdmVyc2UgZWFjaCBlbGVtZW50CiAgICB7CiAgICAgICAgaW50IGogPSAwOyAvLyB0cmF2ZXJzZSBhbGwgd2llZ2h0cyBqIDw9IFcKCiAgICAgICAgLy8gaWYgaSBpcyBvZGQgdGhhdCBtZWFuIHRpbGwgbm93IHdlIGhhdmUgb2RkCiAgICAgICAgLy8gbnVtYmVyIG9mIGVsZW1lbnRzIHNvIHdlIHN0b3JlIHJlc3VsdCBpbiAxdGgKICAgICAgICAvLyBpbmRleGVkIHJvdwogICAgICAgIGlmIChpJjEpCiAgICAgICAgewogICAgICAgICAgICB3aGlsZSAoKytqIDw9IFcpIC8vIGNoZWNrIGZvciBlYWNoIHZhbHVlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh3dFtpXSA8PSBqKSAvLyBpbmNsdWRlIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICBtYXRbMV1bal0gPSBtYXgodmFsW2ldICsgbWF0WzBdW2otd3RbaV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRbMF1bal0gKTsKICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgIC8vIGV4Y2x1ZGUgZWxlbWVudAogICAgICAgICAgICAgICAgICAgIG1hdFsxXVtqXSA9IG1hdFswXVtqXTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIC8vIGlmIGkgaXMgZXZlbiB0aGF0IG1lYW4gdGlsbCBub3cgd2UgaGF2ZSBldmVuIG51bWJlcgogICAgICAgIC8vIG9mIGVsZW1lbnRzIHNvIHdlIHN0b3JlIHJlc3VsdCBpbiAwdGggaW5kZXhlZCByb3cKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB3aGlsZSgrK2ogPD0gVykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHd0W2ldIDw9IGopCiAgICAgICAgICAgICAgICAgICAgbWF0WzBdW2pdID0gbWF4KHZhbFtpXSArIG1hdFsxXVtqLXd0W2ldXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFsxXVtqXSk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgbWF0WzBdW2pdID0gbWF0WzFdW2pdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGkrKzsKICAgIH0KCiAgICAvLyBSZXR1cm4gbWF0WzBdW1ddIGlmIG4gaXMgb2RkLCBlbHNlIG1hdFsxXVtXXQogICAgcmV0dXJuIChuJjEpPyBtYXRbMF1bV10gOiBtYXRbMV1bV107Cn0KCmludCBtYWluKCkKewppb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApLGNpbi50aWUoMCksY291dC50aWUoMCk7CgppbnQgVyxuLGk7CiAgY2luPj5XPj5uOwogIGZvcihpPTA7aTxuOysraSkKICAgIGNpbj4+dmFsW2ldPj53dFtpXTsKCiAgICBjb3V0IDw8IEtuYXBTYWNrKHZhbCwgd3QsIG4sIFcpIDsKICAgIHJldHVybiAwOwp9Cg==