码迷,mamicode.com
首页 > 其他好文 > 详细

P1450 [HAOI2008]硬币购物

时间:2018-10-14 13:48:05      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:原理   方案   can   http   直接   n+1   cst   code   ref   

P1450 [HAOI2008]硬币购物


完全背包+容斥

真是秒呀

方案数统计。如果无法直接计算出来,可以尝试使用容斥原理进行拼凑。

你看,这个题中的对答案有影响的元素只有4个。

\(2^n\)次方的容斥完全可以做

我们可以使用所有的方案数,减去一个硬币不合法的方案数,加上两个硬币不合法的方案数,然后如此搞一搞

就可以了。

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
const int maxn=101000;
long long f[maxn+1000];
long long D[5],d[5];
int main()
{
    long long tot=0;
    for(int i=0;i<=3;i++)   scanf("%lld",&D[i]);
    scanf("%lld",&tot);
    f[0]=1;
    /*for(int i=1;i<maxn;i++)
        for(int j=1;j<=4;j++)
        {
            if(i-D[j]<0)   continue;
            f[i]+=f[i-D[j]];
        }*/
    for(int i=0;i<=3;i++)
        for(int j=D[i];j<=maxn;j++)
            f[j]+=f[j-D[i]];//不考虑限制
    for(int i=1;i<=tot;i++)
    {
        long long C,S;
        int T;
        for(int j=0;j<=3;j++)   scanf("%lld",&d[j]);
        scanf("%lld",&S);
        int ans=0;
        for(int j=0;j<16;j++)
        {
            C=S;T=0;
            for(int k=0;k<=3;k++)
                if(j&(1<<k))
                {
                    C-=(d[k]+1)*D[k];//计算不合法的数值
                    T^=1;
                }
            if(C<0) continue;
            ans=ans+(T ? -1 : 1)*f[C];//进行容斥
        }
        printf("%lld\n",ans);
    }
}

P1450 [HAOI2008]硬币购物

标签:原理   方案   can   http   直接   n+1   cst   code   ref   

原文地址:https://www.cnblogs.com/Lance1ot/p/9785509.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!