做点弱智题压压惊
先假设没有限制,完全背包搞一搞
容斥一下,枚举每种是不是超过了限制,超过的就把S减掉
也就是说每一种情况的方案数是f[s-Σex[i]*c[i]*d[i]]
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define rep(i,l,r) for(int i=l;i<=r;i++) #define per(i,r,l) for(int i=r;i>=l;i--) #define mmt(a,v) memset(a,v,sizeof(a)) using namespace std; typedef long long ll; const int N=100000+5; ll f[N]; ll ans; int c[5],d[5],s; void dfs(int i,int sum,int flag){ if(sum>s)return; if(i>4){ ans+=flag*f[s-sum]; return; } dfs(i+1,sum+(d[i]+1)*c[i],-flag); dfs(i+1,sum,flag); } int main(){ //freopen("a.in","r",stdin); rep(i,1,4)scanf("%d",&c[i]); f[0]=1; rep(i,1,4) rep(j,c[i],100000) f[j]+=f[j-c[i]]; int n;scanf("%d",&n); while(n--){ rep(i,1,4)scanf("%d",&d[i]); scanf("%d",&s); ans=0; dfs(1,0,1); printf("%lld\n",ans); } return 0; }