这类不定方程问题的解法叫DFS(深度优先搜索),用数组记录搜索过的树上的路径
const int r = 5;
const int m = 3;
// 数组里多定义一个元素,减少代码里的边界判断。数组全初始化为0
int jumps[r + 1] = {}; // 记录每一次跳分别是几层台阶
int partialTotals[r + 1] = {}; // 记录当前已经跳的台阶总数,部分和
// 找到一个解,打印出来
void print(int step) {
for (int k = 1; k <= step; ++k)
printf("%d ", jumps[k]);
printf("\n");
}
// 跳一下。step表示当前是第几跳
void jump(int step) {
// 当前这一跳的台阶数,从1到m都尝试一下。
for (int k = 1; k <= m; ++k)
{
// 当前这一跳所跳的台阶数
jumps[step] = k;
// 到目前为止跳过的总台阶数,部分和
partialTotals[step] = partialTotals[step - 1] + k;
if (partialTotals[step] == r) {
// 找到一个解,并终止当前的尝试,剪枝。因为在当前这一跳,不可能再找到下一个解了
print(step);
break;
}
else if (partialTotals[step] > r) {
// 部分和大于整体和,终止当前的尝试,剪枝。因为在当前这一跳,不可能再找到下一个解了
break;
}
else {
// 部分和小于整体和,尝试下一跳
jump(step + 1);
}
}
}
int main()
{
// 从第一跳开始
jump(1);
return 0;
}
--
修改:z16166 FROM 221.218.160.*
FROM 221.218.160.*