BZOJ 1042: [HAOI2008]硬币购物 容斥原理_背包_好题
Code:
#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 1000000
#define N 200000
#define ll long long
using namespace std;
int c[5],d[5];
ll dp[maxn];
int main(){
//setIO("input");
for(int i=0;i<4;++i) scanf("%d",&c[i]);
dp[0]=1;
for(int i=0;i<4;++i) for(int j=c[i];j<=N;++j) dp[j]+=dp[j-c[i]];
int T;
scanf("%d",&T);
while(T--){
for(int i=0;i<4;++i) scanf("%d",&d[i]);
int res;
scanf("%d",&res);
ll ans=0;
for(int i=0;i<16;++i){
int cnt=0,cur=res;
for(int j=0;j<4;++j) if((i>>j)&1) cnt^=1,cur-=(d[j]+1)*c[j];
if(cur<0) continue;
if(cnt) ans-=dp[cur]; else ans+=dp[cur];
}
printf("%lld\n",ans);
}
return 0;
}