HDU 2844 Coins

题解:背包问题方案总数,用二进制优化。

#include <cstdio>

#include <iostream>

using namespace std;  

int f[100005];  

int a[105],c[105];  

int main()  

{  

    int i,j,k,n,m,cnt;  

    while(scanf("%d%d",&n,&m)!=EOF)  

    {  

        if(n==0&&m==0) break;  

        for(i=0;i<n;i++)  

          scanf("%d",&a[i]);  

        for(i=0;i<n;i++)  

          scanf("%d",&c[i]);  

        memset(f,0,sizeof(f));  

        f[0]=1;  

        for(i=0;i<n;i++)  

        {  

          cnt=c[i];  

          for(k=1;k<=cnt;k<<=1)  

          {  

            for(j=m;j>=k*a[i];j--)  

               f[j]+=f[j-k*a[i]];  

            cnt-=k;  

          }  

          if(cnt)  

          for(j=m;j>=cnt*a[i];j--) f[j]+=f[j-cnt*a[i]];  

        }  

        int sum=0;  

        for(i=1;i<=m;i++)  

          if(f[i]) sum++;  

        printf("%d\n",sum);  

    }  

    return 0;  

}  

 

你可能感兴趣的:(HDU)