牛客网:幸运的袋子
一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。
例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3
你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的。现在让你编程计算一下你可以获得的多少种不同的幸运的袋子。
第一行输入一个正整数n(n ≤ 1000) 第二行为n个数正整数xi(xi ≤ 1000)
输出可以产生的幸运的袋子数
10
输入
3
1 1 1输出
2
如图:
以1,1,2,3,5,这一组数据为例,
11,112,1123,11235不满足,则退回上一级;1125,不满足,向上退一级;113不满足,退回上一级;115,遍历结束,退回上一级;12,123不满足退出;13,135不满足退出;15,遍历结束。

对于重复的的处理:如1,3,3,9这组数据,13,133不满足;下一个3第一个组合也是13,与前面重复。所以当下一个数与当前数相同时,直接跳过。

#include
#include
#include
using namespace std;
int GetLuck(vector<int>& v, int n, int pos, int sum, int product)
{
int count = 0;
for (int i = pos; i < n; i++)
{
sum += v[i];
product *= v[i];
if (sum > product)
{
count += 1 + GetLuck(v, n, i + 1, sum, product);
}
else if (v[i] == 1)
{
count += GetLuck(v, n, i + 1, sum, product);
}
else
{
break;
}
//回会到上一级,
sum -= v[i];
product /= v[i];
//判断是否有重复
while (v[i] == v[i + 1] && i < n - 1)
{
i++;
}
}
return count;
}
int main()
{
int n = 0;
while (cin >> n)
{
vector<int> v(n);
for (int i = 0; i < n; i++)
{
cin >> v[i];
}
//先对数组排序
sort(v.begin(), v.end());
cout << GetLuck(v, n, 0, 0, 1) << endl;
}
return 0;
}