BZOJ1042: [HAOI2008]硬币购物

容斥原理

#include<cstdio>
#include<cstring>
using namespace std;

char c;
inline void read(int&a)
{
    a=0;do c=getchar();while(c<'0'||c>'9');
    while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();                                                                                                                                                                  

}

long long f[100001];
long long ans;
int d[10],C[10];

void DFS(int x,int k,int res)
{
    if(res<0)return;
    if(x==5)
    {
        if(k&1)ans-=f[res];
        else ans+=f[res];
        return;
    }
    DFS(x+1,k+1,res-(d[x]+1)*C[x]);
    DFS(x+1,k,res);
}


int main()
{
    int i,T,j;
    for(i=1;i<=4;i++)
    read(C[i]);
    read(T);
    f[0]=1;
    int x;
    for(i=1;i<=4;i++)
        for(j=C[i];j<=100000;j++)
            f[j]+=f[j-C[i]];
     while(T--)
      {
        for(i=1;i<=4;i++)
          read(d[i]);
        read(x);
        ans=0;
        DFS(1,0,x);
        printf("%lld\n",ans);
    }

    return 0;
}

你可能感兴趣的:(BZOJ1042: [HAOI2008]硬币购物)