[BZOJ 1042][HAOI2008]硬币购物:容斥原理

来源:互联网 发布:java初学者小项目源码 编辑:程序博客网 时间:2024/06/06 07:01

点击这里查看原题

f[i]表示在不考虑硬币数量的情况下,达到i元的方案数。
于是进行容斥,答案=所有方案数-有一种硬币超出限制(即使用d[i]+1枚硬币)+有两种超出限制-有三种超出限制+有四种超出限制

/*User:SmallLanguage:C++Problem No.:1042*/#include<bits/stdc++.h>#define ll long long#define inf 999999999using namespace std;const int M=1e5+5;int c[5],d[5],s;ll f[M],ans;void dfs(int now,int sum,int cnt){    if(now==5){        if(s-sum<0) return;        if(cnt&1) ans-=f[s-sum];        else ans+=f[s-sum];        return;    }    dfs(now+1,sum+(d[now]+1)*c[now],cnt+1);    dfs(now+1,sum,cnt);}void solve(){    ans=0;    for(int i=1;i<=4;i++) scanf("%d",&d[i]);    scanf("%d",&s);    dfs(1,0,0);    printf("%lld\n",ans);}int main(){    freopen("data.in","r",stdin);//    for(int i=1;i<=4;i++) scanf("%d",&c[i]);    f[0]=1;    for(int i=1;i<=4;i++)        for(int j=c[i];j<=1e5;j++) f[j]+=f[j-c[i]];    int t;    scanf("%d",&t);    while(t--) solve();    return 0;}
阅读全文
0 0
原创粉丝点击