dfs优化的一个疑问
查看原帖
dfs优化的一个疑问
816549
52wyd楼主2023/4/28 12:38

下边的代码中

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;
}



2023/4/28 12:38
加载中...