二进制状态压缩,然后暴力破解即可。
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 25;
int num[MAXN], ans[MAXN]; //每个小团体的票数,成为关键加入者的次数
int main()
{
int T;
cin >> T;
while (T--)
{
memset(ans, 0, sizeof(ans));
int n;
cin >> n;
int sum = 0; //总票数
for (int i = 0; i < n; i++)
{
cin >> num[i];
sum += num[i];
}
for (int i = 0; i < (1 << n); i++)
{
int temp = 0; //当前联盟中所有小团体的票数和
for (int j = 0; j < n; j++)
{
if ((1 << j) & i)
temp += num[j];
}
if (temp > sum / 2)
{
//依次判断当前联盟中,每个小团体是否为关键加入者
for (int j = 0; j < n; j++)
{
if (((1 << j) & i) && (temp - num[j] <= sum / 2))
ans[j]++;
}
}
}
cout << ans[0];
for (int i = 1; i < n; i++)
cout << " " << ans[i];
cout << endl;
}
return 0;
}
继续加油。
本文介绍了一种使用二进制状态压缩进行暴力破解的算法实现,通过遍历所有可能的组合,找出关键的加入者,适用于解决特定类型的问题。代码示例展示了如何在C++中实现这一算法。
&spm=1001.2101.3001.5002&articleId=106582796&d=1&t=3&u=73ee488c28b742488f4493d06491cc55)
1360

被折叠的 条评论
为什么被折叠?



