[HAOI2008]硬币购物

通过观察数据范围,我们可以发现这个题,跑背包我们会T掉。。。

通过观察题目我们可以发现,如果我们跑完全背包,会有许多不合法的方案。。。

辣么,我们就容斥一下好了。。。QAQ。。。

呆码:

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;

int c[6],d[6],n,s;
ll f[100010];

int main()
{
    for(int i=1;i<=4;i++)
        scanf("%d",&c[i]);
    scanf("%d",&n);
    f[0]=1;
    for(int i=1;i<=4;i++)
        for(int j=c[i];j<=100010;j++)
            f[j]+=f[j-c[i]];
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=4;j++)
            scanf("%d",&d[j]);
        scanf("%d",&s);
        ll ans=f[s]; 
        for(int j=1;j<=15;j++)
        {
            int tmp,k,now=s,g;
            for(tmp=j,g=1,k=0;tmp;tmp>>=1,g++)
                if(tmp&1) k^=1,now-=(d[g]+1)*c[g];
            if(now>=0) k ? ans-=f[now] : ans+=f[now];
        }
        printf("%lld
",ans);
    }
}
代码
原文地址:https://www.cnblogs.com/zzzyc/p/9264044.html