#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5;
int n,dp[N + 5],c[5],d[5],s;
signed main(){
dp[0] = 1;
cin >> c[1] >> c[2] >> c[3] >> c[4];
for (int i = 1;i <= 4;i ++)
for (int j = c[i];j <= N;j ++)
dp[j] += dp[j - c[i]];
cin >> n;
while (n --){
cin >> d[1] >> d[2] >> d[3] >> d[4] >> s;
int ans = dp[s];
for (int i = 1;i <= 15;i ++){ // 15种方案
int k = 0,num = 0;
for (int j = 0;j < 4;j ++){
if ((1 << j) & i){ // 判断第就j位是否为1
num ++;
k += c[j + 1] * (d[j + 1] + 1);
}
}
int flag = 1;
if (num & 1) flag = -1; // 容斥计算公式
if (s > k) ans += flag * dp[s - k]; // 加上或者减去
}
cout << ans << endl;
}
return 0;
}
在这句话中:
if (s > k) ans += flag * dp[s - k]; // 加上或者减去
按理来说是可以划上等号的,因为钱数的限制,而样例没过的我提交上去一片绿……
建议加强数据。