一 算法简述
设置X为累加和表达式的正数和,设置Y为累加和表达式的负数和,则满足
X - Y = 10
X + Y = 44(2 + 3 + ... + 9)
推导可得X = 27,即只需从这8个连续数找到累加和为27的这些数,比如X可以是2 + 3 + 5 + 8 + 9或2 + 3 + 4 + 5 + 6 + 7等等
难点是找到所有解。
算法采用随机迭代法,即迭代若干次,随机从8个数选择数进行累加和,检测是否满足累加和为27。
二 代码
// 2/10,3/10,4/10,5/10,6/10,7/10,8/10,9/10按照+或-进行组合形成累加和为1的可能性是多少种
// 例如:2/10 + 3/10 + 5/10 + 8/10 + 9/10 - 4/10 - 6/10 - 7/10
// positive_set为{ {2,3,5,8,9}, {2,3,4,5,6,7} }即目标解正数集合
void get_percent_sum(std::set<std::vector<int> >&positive_set) {
srand(time(0));
static const int N = 8;
static const int array[N] = { 2, 3, 4, 5, 6, 7, 8, 9 };
int iteration_count = 1000000; // 迭代100w次
int sum = 0;
std::vector<int>positive;
std::set<int>index_set;
for (int loop = 1;loop < iteration_count;++loop) {
sum = 0;
positive.clear();
index_set.clear();
for (int i = 1;i <= N;i++) {
int index = -1;
do {
index = rand() % N;
} while (index_set.find(index) != end(index_set));
if (27 == sum) {
sort(begin(positive), end(positive));
positive_set.insert(positive);
break;
}
else if (sum + array[index] <= 27) {
sum += array[index];
positive.push_back(array[index]);
index_set.insert(index);
}
else {
break;
}
}
}
}
https://github.com/wangzhicheng2013/common_utility