题目链接:https://vjudge.net/problem/HDU-1557
题目: 在选举问题中,总共有n个小团体,每个小团体拥有一定数量的选票数。如果其中m个小团体的票数和超过总票数的一半,则此组合为“获胜联盟”。n个团体可形成若干个获胜联盟。一个小团体要成为一个“关键加入者”的条件是:在其所在的获胜联盟中,如果缺少了这个小团体的加入,则此联盟不能成为获胜联盟。一个小团体的权利指数是指:一个小团体在所有获胜联盟中成为“关键加入者”的次数。请你计算每个小团体的权利指数。
Input
输入数据的第一行为一个正整数T,表示有T组测试数据。每一组测试数据的第一行为一个正整数n(0<n<=20)。第二行有n个正整数,分别表示1到n号小团体的票数。
Output
对每组测试数据,在同一个行按顺序输出1到n号小团体的权利指数。
Sample Input
2
1
10
7
5 7 4 8 6 7 5
Sample Output
1
16 22 16 24 20 22 16
题目大意:就是求每个小团体作为“关键加入者”的次数。
解题思路:我们使用枚举的方法。假设我们想要求第n个小团体的权力指数,我们就将这个小团体提取出来,让剩下的小团体进行组合(枚举出所有可能的组合),每枚举出一种组合我们都进行判断,若该组合的票数不超过总票数一半但加上第n个小团体的票数后就超过总票数一半,则第n个小团体的权力指数加一,以此类推,枚举所有的小团体即可。
AC代码:(代码中将某个小团体提取出来的方法是将该小团体放到数组最后)
#include <cstdlib>
#include <iostream>
using namespace std;
int n, num[20], answer[20],team;
int total;
//end还要递归层数
void sun(int start,int end,int now) {
//最后一层递归
if (end == 1) {
if (now<=<