bzoj 1042 硬币购物

预处理+1,-1容斥即可,还是想不明白spring为什么要×组合数

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>

#define md
#define ll long long
#define inf (int) 1e9
#define eps 1e-8
#define N 100010
#define mxn 100000
using namespace std;
ll f[N],ans=0;
ll w[4],hv[4];
int s;
void dp()
{
f[0]=1;
for (int i=0;i<=3;i++)
for (int j=w[i];j<=mxn;j++)
f[j]+=f[j-w[i]];
}

ll solve(int opt)
{
ll sum=0;
for (int i=0;i<=3;i++) if (opt&(1<<i)) sum+=w[i]*(hv[i]+1);
if (sum>s) return 0;
return f[s-sum];
}

ll bit(int opt)
{
int sum=0;
for (int i=0;i<=3;i++) sum+=(opt>>i)&1;
return sum;
}

int main()
{
int pos;
scanf("%lld%lld%lld%lld%d",&w[0],&w[1],&w[2],&w[3],&pos);
dp();
for (int i=1;i<=pos;i++)
{
ans=0;
scanf("%lld%lld%lld%lld%lld",&hv[0],&hv[1],&hv[2],&hv[3],&s);
for (int j=0;j<=15;j++)
if (bit(j)&1) ans-=solve(j); else ans+=solve(j);
printf("%lld\n",ans);
}
return 0;
}

你可能感兴趣的:(bzoj 1042 硬币购物)