一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。 例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3 你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的。现在让你编程计算一下你可以获得的多少种不同的幸运的袋子。
C++代码:
#include <iostream> #include <vector> #include <algorithm> using namespace std; // 注释部分去掉可以用于记录满足条件的序列 void combination(vector<unsigned int>::iterator Begin, const vector<unsigned int>::iterator& End, unsigned int& curSum, unsigned int& curMul, unsigned int& counts/*, vector<unsigned int>& v*/) { if(Begin == End) return; curSum += *Begin; curMul *= *Begin; // v.push_back(*Begin); if(curSum > curMul) { // cout << "1, "; // for(vector<unsigned int>::size_type i=0; i < v.size(); i++) // cout << v[i] << ", "; // cout << endl; ++counts; combination(Begin+1, End, curSum, curMul, counts/*, v*/); } curSum -= *Begin; curMul /= *Begin; // v.pop_back(); unsigned int num = *Begin; while(num == *Begin) ++Begin; combination(Begin, End, curSum, curMul, counts/*, v*/); } int getLuckBags(vector<unsigned int> bag) { unsigned int counts = 0; if(bag.size() >= 2) { sort(bag.begin(), bag.end()); vector<unsigned int>::iterator Begin = bag.begin() + 1; unsigned int curSum = bag[0], curMul = bag[0]; //vector<unsigned int> v; // 用于记录满足条件的一组序列 combination(Begin, bag.end(), curSum, curMul, counts/*, v*/); } return counts; } int main() { unsigned int n; while(cin >> n) { if(n <= 1000) { vector<unsigned int> bag(n); for(unsigned int i=0; i < n; i++) cin >> bag[i]; cout << getLuckBags(bag) << endl; } } return 0; }
