我想知道200ms以内的算法 :)
也许是单调队列?
还没学...
/*
* HDU-2844 coins
* mike-w
* 2011-10-15
* ----------------
* 多重背包
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 111
#define MAXM 100100
long N,M;
long a[MAXN],c[MAXN];
char opt[MAXM];
int read(void)
{
long i;
scanf("%ld%ld",&N,&M);
if(M==0 && N==0) return 0;
for(i=0;i<N;i++)
scanf("%ld",a+i);
for(i=0;i<N;i++)
scanf("%ld",c+i);
return 1;
}
long count(void)
{
long i,j,k,t,cnt;
memset(opt,0,sizeof(opt));
opt[0]=1;
for(i=0;i<N;i++)
{
for(j=1,t=a[i];j<=c[i];c[i]-=j,j<<=1,t<<=1)
for(k=M;k>=t;k--)
if(opt[k-t])
opt[k]=1;
if(c[i]>0)
for(k=M,t=a[i]*c[i];k>=t;k--)
if(opt[k-t])
opt[k]=1;
}
for(i=1,cnt=0;i<=M;i++)
if(opt[i])
cnt++;
return cnt;
}
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("2844.in","r",stdin);
#endif
while(read())
printf("%ld\n",count());
return 0;
}