二进制状态压缩,然后暴力破解即可。
#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;
}
继续加油。