小编典典

C ++中的分区函数

algorithm

我需要C
++中的算法解决方案来解决分区问题

简单说明:查找所有得到数字n的总和。例如

  • 输入5
  • 输出:
    • 11111
    • 2111
    • 311
    • 41
    • 5
    • 221
    • 23

这个问题似乎很简单,但是我找不到解决方案。我即将做出这种暴力破解,因为最高的输入是11。关于该问题的文章是高度数学的,我真的不明白。

谢谢你们!


阅读 244

收藏
2020-07-28

共1个答案

小编典典

/*
E.g.
input number:5
5
1 4
1 1 3
1 1 1 2
1 1 1 1 1
1 2 2
2 3
*/
#include <iostream>
#include <vector>

using namespace std;

void print (vector<int>& v, int level){
    for(int i=0;i<=level;i++)
        cout << v[i] << " ";
    cout << endl;
}

void part(int n, vector<int>& v, int level){
    int first; /* first is before last */

    if(n<1) return ;
    v[level]=n;
    print(v, level);

    first=(level==0) ? 1 : v[level-1];

    for(int i=first;i<=n/2;i++){
        v[level]=i; /* replace last */
        part(n-i, v, level+1);
    }
}

int main(){
    int N;
    cout << "input number:";
    cin >> N;

    vector<int> v(N);

    part(N, v, 0);
}
2020-07-28