建议加强数据!
查看原帖
建议加强数据!
996732
Marky_shine楼主2024/8/26 15:10
#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]; // 加上或者减去 

按理来说是可以划上等号的,因为钱数的限制,而样例没过的我提交上去一片绿……

建议加强数据。

2024/8/26 15:10
加载中...