总算明白完全背包和多重背包中的二进制优化是怎么回事了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<math.h>
#include<algorithm>
using namespace std;
int a[100002];
int dp[100002];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(dp,0,sizeof(dp));
int i,j,k;
int x,y;
k=0;
int maxx=0x3f3f3f3f;
int tmp;
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
if(y>n)
{
if(y<maxx)
maxx=y;
continue;
}
if(x*y>n)
{
tmp=1;
while(x>tmp)
{
if(tmp*y>n)
break;
a[k++]=tmp*y;
x-=tmp;
tmp=tmp*2;
}
}
else
{
tmp=1;
while(x>tmp)
{
a[k++]=tmp*y;
x-=tmp;
tmp=tmp*2;
}
a[k++]=x*y;
}
}
sort(a,a+k);
for(i=0;i<k;i++)
for(j=n;j>=a[i];j--)
{
dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
}
cout<<(fabs(n*1.0-dp[n])<fabs(maxx-n*1.0)?dp[n]:maxx)<<endl;;
}
return 0;
}