D. Colored Balls
题意:给你n个颜色不同的小球,以及每种颜色小球的数量,让你求 种集合分割方案的价值和
我们考虑一个集合的贡献,如果最大值大于sum的一半,那么值就是max,反之值就是(sum+1)/2
那么我们可以sort a数组枚举最大值,同时简单计数dp统计 各个 总数量的集合的方案数
int n, m;
int a[N];
int f[M];
void solve()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i], m += a[i];
sort(a + 1, a + 1 + n);
int ans = 0;
f[0] = 1;
for (int i = 1; i <= n; i++) // sort之后,就相当于枚举了最大值
{
int x = a[i];
for (int j = 0; j <= m; j++)
{
if (j <= x)
ans = (ans + x * f[j]) % mod;
else
ans = (ans + (x + j + 1) / 2 * f[j]) % mod;
}
for (int j = m; j >= x; j--)
f[j] = (f[j] + f[j - x]) % mod;
}
cout << ans % mod << endl;
}