【发布时间】:2016-04-22 11:47:16
【问题描述】:
我正在尝试使用动态循环数来计算以下数量。伪代码看起来像
当 k = 1 时,
for (x1 =0;x1<=nmax[1];x1++){
a = a + x1 * (x1>upper[1]);
}
当 k = 2
for (x1 =0;x1<=nmax[1];x1++){
for (x2 =0;x2<=nmax[2];x2++){
a = a + x1 * (x1<upper[1]) * x2 *(x1+x2>upper[2]);
}
}
当 k = 3
for (x1 =0;x1<=nmax[1];x1++){
for (x2 =0;x2<=nmax[2];x2++){
for (x3 =0;x3<=nmax[3];x3++){
a = a + x1 * (x1<upper[1]) * x2 *(x1+x2<upper[2]) * x3 *(x1+x2+x3>upper[3]);
}
}
}
nmax 和 upper 是预定义的向量。
为了说明布尔表达式背后的逻辑,作为一个例子,随着k的增加,布尔表达式的发展如下。对于第一个到最后一个之前的第二个,它是 .
(x1>upper[1])
(x1<upper[1]) AND (x1+x2>upper[2])
(x1<upper[1]) AND (x1+x2<upper[2]) AND (x1+x2+x3>upper[3])
(x1<upper[1]) AND (x1+x2<upper[2]) AND (x1+x2+x3<upper[3]) AND (x1+x2+x3+X4>upper[4])
(x1<upper[1]) AND (x1+x2<upper[2]) AND (x1+x2+x3<upper[3]) AND (x1+x2+x3+x4<upper[4]) AND (x1+x2+x3+x4+x5>upper[5])
有没有办法编写一个使用 k 作为参数的函数来实现上述功能?
【问题讨论】:
-
您想生成所有可能的 x1, x2, ... xn 并计算值。你应该使用en.wikipedia.org/wiki/Backtracking
-
将大小为
k的vector<int> x初始化为全零。在一个循环中,将 1 加到x[0];如果这导致它超过nmax,将其重置为 0 并在x[1]上加一(如果x[1]结果超过,将其重置为 0 并增加x[2],依此类推)。基本上,随着进位而增加。对于这样计算的x的每个状态,运行第二个嵌套循环来计算总和并更新a。 -
感谢您的回复。 “运行第二个嵌套循环”是什么意思?