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 个不重复的数,也可以借用类似方法,主要是对循环内部的变量、参数的传递进行控制以达到我们想要的效果。 

                

posted @ 2020-11-01 17:04  Fool_one  阅读(125)  评论(0编辑  收藏  举报