C++ 中的分区函数

Partition function in c++

本文关键字:函数 分区 C++      更新时间:2023-10-16

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

简单解释:找到得到数字 n 的所有总和。例如

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

这个问题似乎很容易,但我找不到解决方案。我接近这个蛮力,因为最高输入是 11。关于这个问题的文章是高度数学化的,我真的不明白。

谢谢大家!

您可以尝试使用函数 F 的递归方法来查找给定数字 X 的所有一级分区,即 X 表示为两个整数 a、b

/*
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);
}

只需将它们按明确定义的顺序排列即可。然后编写一个函数来查找该顺序中的第一个条目。然后编写一个函数来查找该顺序中的下一个条目。那么问题就微不足道了。

例如,在 5 的情况下,第一个条目有两个选择,即 11111 或 5。这些条目中的任何一个都很容易生成。然后,您只需要一个操作即可从给定条目中获取"下一个条目"。重复该操作,直到失败并完成。

我建议这个顺序:

 11111
 1112
 113
 122
 14
 23
 5