//多重背包问题,二进制划分
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int f[100050],c[10050];
int main()
{
int sum,n;
while(cin>>sum>>n)
{
memset(f,0,sizeof(f));
memset(c,0,sizeof(c));
int i,j,num,money;
int cnt=0;
for(i=1;i<=n;i++)
{
cin>>num>>money;
for(j=1;j<=num;j*=2)
{
c[++cnt]=j*money;
num-=j;
}
if(num>0) c[++cnt]=num*money;
c[i]=money;
}
for(i=1;i<=cnt;i++)
for(j=sum;j>=c[i];j--)
f[j]=max(f[j],f[j-c[i]]+c[i]);
cout<<f[sum]<<endl;
}
}
北大POJ1276 多重背包
最新推荐文章于 2019-05-10 17:36:57 发布