题目:
http://www.lydsy.com/JudgeOnline/problem.php?id=1042
dp预处理+容斥原理。
f[i]表示利用4种面值不限制个数得到i元的方案。
ans=f[s]-f[s-c1*(d1+1)]-f[s-c2*(d2+1)]……+f[s-c1*(d1+1)-c2*(d2+1)]……(容斥原理)
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
using namespace std;
const int MaxS=100001;

int c[5],d[5],tot;
long long f[MaxS],ans;

void treat()


{
memset(f,0,sizeof(f));
f[0]=1;
for (int i=1;i<=4;i++)
for (int j=c[i];j<=MaxS;j++)

{
f[j]+=f[j-c[i]];
// cout<<j<<' '<<f[j]<<endl;
}
}

void dfs(int now,int state,int s)


{
if (s<0 || now>5)

{
return;
}
ans+=state*f[s];
for (int i=now;i<=4;i++)

{
dfs(i+1,-state,s-(d[i]+1)*c[i]);
}
}

int main()


{
cin>>c[1]>>c[2]>>c[3]>>c[4]>>tot;
treat();
for (int i=0;i<tot;i++)

{
int s;
cin>>d[1]>>d[2]>>d[3]>>d[4]>>s;
ans=0;
dfs(1,1,s);
cout<<ans<<endl;
}
return 0;
}
