http://poj.org/problem?id=1276
#include<iostream>
#include<stdio.h>
#include<string.h>
const int N=120005;
using namespace std;
int v,n,num[N],val[N],dp[N];
void zeropack(int c)
{
for(int i=v;i>=c;i--)
dp[i]=max(dp[i],dp[i-c]+c);
}
void completepack(int c)
{
for(int i=c;i<=v;i++)
dp[i]=max(dp[i],dp[i-c]+c);
}
void multipack(int c,int num)
{
if(c*num>=v)
completepack(c);
else
{
int k=1;
while(k<num)
{
zeropack(k*c);
num-=k;
k*=2;
}
zeropack(num*c);
}
}
int main()
{
int i;
while(scanf("%d%d",&v,&n)!=EOF)
{
int flag=0;
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
{
scanf("%d%d",&num[i],&val[i]);
if(val[i]==v){dp[v]=v;flag=1;}
}
if(v==0){dp[v]=0;flag=1;}
if(!flag)
{
for(i=0;i<n;i++)
{
if(num[i]&&val[i]<=v)multipack(val[i],num[i]);
}
}
printf("%d\n",dp[v]);
}
}