E-整数拆分
题解
这题就是dfs......,好八,当时没什么时间,一时慌了,只过了一个测试样例/(ㄒoㄒ)/~~。
在dfs的过程中,应该传递三个参数,当前最小值 p,层数 u,累加和 sum。
p:既可以避免重复,也可以按照 >= p的形式传递。
u:打印输出的个数。
sum:判断是否等于 n,并在 > sum 的时候进行剪枝。
#include <iostream> using namespace std; const int N = 110; int n, ans; int path[N]; void dfs(int k, int u, int sum) { if (sum == n) { cout << n << " = "; for (int i = 0; i < u; ++i) { if (i == u - 1) cout << path[i] << endl; else cout << path[i] << " + "; } ++ans; return ; } if (sum > n) { return ; } // 从最小的 1 开始枚举的 // i -> 1 ~ n - 1 // j -> i ~ n - 1 // k -> j ~ n - 1 for (int i = k; i < n; ++i) { path[u] = i; dfs(i, u + 1, sum + i); } } int main() { cin >> n; dfs(1, 0, 0); cout << ans << endl; return 0; }
这一题其实有很多启发哦,比如从 n 个数中选取 m 个不重复的数,也可以借用类似方法,主要是对循环内部的变量、参数的传递进行控制以达到我们想要的效果。