c++中的分区函数

Posted

技术标签:

【中文标题】c++中的分区函数【英文标题】:Partition function in c++ 【发布时间】:2012-05-23 08:36:23 【问题描述】:

我需要partition-problem 的 C++ 算法解决方案

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

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

这个问题看起来很简单,但我找不到解决方案。我已经接近完成这个暴力破解了,因为最高输入是 11。关于这个问题的文章是高度数学化的,我真的不明白。

谢谢大家!

【问题讨论】:

一个快速的谷歌将在各种语言中找到这个整数分区问题的算法;例如:homepages.ed.ac.uk/jkellehe/partitions.php。我认为您对“C++ 中的算法解决方案”的要求有点不靠谱。您是指“一种算法”还是“C++ 中一种算法的实现”? 是的,当然是“算法”。我会看看你的链接,看起来不错!谢谢:) 【参考方案1】:

您可以尝试使用函数 F 的递归方法来查找给定数字 X 的所有第一级分区,即 X 表示为两个整数 a,b Here is an example 在 Python 中,它可以帮助你用 C++ 编写自己的代码

【讨论】:

【参考方案2】:
/*
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);

【讨论】:

非常感谢!!这正是我需要的:)【参考方案3】:

只需将它们按明确定义的顺序排列即可。然后编写一个函数以按该顺序查找第一个条目。然后编写一个函数以按该顺序查找下一个条目。那么问题就很简单了。

例如,在 5 的情况下,第一个条目有两个选择,11111 或 5。这些条目中的任何一个都可以轻松生成。然后,您只需要一个操作即可从给定条目中获取“下一个条目”。重复该操作,直到失败为止。

我建议这个顺序:

 11111
 1112
 113
 122
 14
 23
 5

【讨论】:

我建议把 122 放在某个地方。 你忘了 221 ;-) 我已经有了一个起点为 11111 的算法。问题是要找到“下一个条目”操作。我试图总是减去一个 1 并将其添加到一个数字中。但这不适用于例如 n=10,因为您有 433 等内容。

以上是关于c++中的分区函数的主要内容,如果未能解决你的问题,请参考以下文章

C++核心编程内存分区模型

C++内存分区模型

C++内存分区模型

C++核心编程之-内存分区模型

分区飞盘 C++

C++:四大内存分区