算法-求和为N的子序列

来源:互联网 发布:网络债券投资 编辑:程序博客网 时间:2024/06/07 05:21

给定正整数N,求1-N中和为N的自序列,如
输入:N=10
输出:
1 2 3 4
1 2 7
1 3 6
1 4 5
1 9
2 3 5
2 8
3 7
4 6
10

算法:DFS+剪枝

#include "stdafx.h"#include<iostream>#include<vector>using namespace std;vector<vector<int>> results;void Dfs(int n,vector<bool> &used,vector<int> &result,int sum,int curI){    if (sum > n) return;    if (sum == n) {        results.push_back(result);        return;    }    for (int i = curI; i <= n; ++i)    {        if (!used[i]) {             if (sum + i <= n) {                used[i] = true;                result.push_back(i);                Dfs(n, used, result, sum + i, i+1);                used[i] = false;                result.pop_back();            }        }    }}int main(){        int n;    while (cin >> n) {        results.clear();        vector<bool> used(n + 1, false);        vector<int> result;        Dfs(n, used, result, 0,1);        for (int i = 0; i < results.size(); ++i)        {            for (int j = 0; j < results[i].size(); ++j)            {                cout << results[i][j] << " ";            }            cout << endl;        }       }    return 0;}
原创粉丝点击