自然数拆分模板如下:
void dfs(int rest, int start) { // 还剩 rest 要拆,本轮只能选不小于 start 的数
if (rest == 0) { /* 输出方案 */ return; }
for (int k = start; k <= rest; k++) {
方案里记下 k;
dfs(rest - k, k); // 下一轮从 k 起选——只增不减
}
}
关于出口 rest == 0 与循环上界 k <= rest,说法正确的是( )
- A. 出口是 rest==0 没错,但循环上界写多大都行,反正出口会兜底
- B. 出口 rest==0 表示剩余量为 0、一组拆法恰好凑齐;上界取 rest,因为单步拆出的数不能超过还剩的量
- C. 出口应该写成 start==n,表示候选数用完了
- D. 出口 rest==0 正确,但上界必须放大到 n,否则会漏解