下边的代码中
for (int i = last; sum + i <= n; i ++) {
dfs(sum + i, i, start + 1);
}
这一部分中为什么把sum + i <= n改成i <= n就会超时?并且代码耗时是原来的两倍。
我是这样理解的:
即使用i <= n,在for进入循环里边递归之后会在递归开头由于(sum + last * (k - start + 1) > n而直接结束递归,也就是说无效的递推深度只有一层,为什么会慢这么多呢?
#include <cstdio>
#include <iostream>
#include <algorithm>
#define int long long
using namespace std;
int n, k;
int cnt;
// sum:当前已经加入的数字的和
// last:最后一个加入的数字
// start:该加入第start个数字了
void dfs(int sum, int last, int start) {
if (sum + last * (k - start + 1) > n)
return;
if (start == k + 1) {
if (sum == n)
cnt ++;
return;
}
for (int i = last; sum + i <= n; i ++) {
dfs(sum + i, i, start + 1);
}
}
signed main() {
cin >> n >> k;
for (int i = 1; i <= n; i ++) {
dfs(i, i, 2);
}
cout << cnt << endl;
return 0;
}