按顺序生成数字分区的不同方法

Different ways of generating the partitions of a number in order

本文关键字:方法 分区 数字 顺序      更新时间:2023-10-16

我的算法教科书中有一个练习,要求我按顺序生成一个数字的分区。我已经解决了这个问题,但是在以传统方式解决练习时,我想出了解决这个问题的新想法。

有传统的方法:

#include <iostream>
#define MAX_PARTITIONS 100
int count = 1;
void printSolution(int* solution, int size)
{
    std::cout << count << "| ";
    count++;
    for(int i = 0; i < size; i++)
    {
        std::cout << solution[i] << " ";
    }
    std::cout << std::endl;
}
void generatePartitions(int* solution, int number, int sum, int partitions)
{
    if(sum == number)
    {
        printSolution(solution, partitions);
        return;
    }
    if(partitions > 1)
    {
        solution[partitions] = solution[partitions - 1];
    }
    else
    {
        solution[partitions] = 0;
    }
    while(solution[partitions] + sum < number)
    {
        solution[partitions]++;
        sum += solution[partitions];
        generatePartitions(solution, number, sum, partitions + 1);
        sum -= solution[partitions];
    }
}
int main(int argc, char const *argv[])
{
    int solution[MAX_PARTITIONS];
    generatePartitions(solution, 4, 0, 0);
    return 0;
}

基本上,当分区数大于1(存在前一个分区)时,我将前一个分区的值分配给当前分区,否则0分配给它。

有新方法:

#include <iostream>
#define MAX_PARTITIONS 100
int count = 1;
void printSolution(int* solution, int size)
{
    std::cout << count << "| ";
    count++;
    for(int i = 0; i < size; i++)
    {
        std::cout << solution[i] << " ";
    }
    std::cout << std::endl;
}
void generatePartitions(int* solution, int number, int sum, int partitions, 
    int start)
{
    if(sum == number)
    {
        printSolution(solution, partitions);
        return;
    }
    solution[partitions] = start;
    while(solution[partitions] + sum < number)
    {
        solution[partitions]++;
        sum += solution[partitions];
        generatePartitions(solution, number, sum, partitions + 1, 
            solution[partitions]);
        sum -= solution[partitions];
    }
}
int main(int argc, char const *argv[])
{
    int solution[MAX_PARTITIONS];
    generatePartitions(solution, 4, 0, 0, 0);
    return 0;
}

如您所见,函数generatePartitions现在接受一个新参数 start 。最初,start 的值是 0 ,并且在每次递归调用时start取当前solution[partitions]的值。因此,它应该以与传统方法相同的方式工作。

但事实并非如此,这些程序的输出完全不同。我不知道出了什么问题。我做错了什么?

递归时忘记移动solution数组的索引。

generatePartitions(solution, number, sum, partitions + 1, 
            solution[partitions]);

成为:

generatePartitions(solution, number, sum, partitions + 1, 
            solution[partitions-1]);

科里鲁链接:http://coliru.stacked-crooked.com/a/83b0418e1b1c9bc1

另外,我建议使用某种形式的std::pair<int,int>和某种二叉树来为你做这件事 - 对我来说,从上到下更有意义,因为我们试图在技术上将一个数字划分或划分为更小的数字;算法可能有点复杂,但当你完成它时,也可以显示一棵树。