按顺序生成数字分区的不同方法
Different ways of generating the partitions of a number in order
我的算法教科书中有一个练习,要求我按顺序生成一个数字的分区。我已经解决了这个问题,但是在以传统方式解决练习时,我想出了解决这个问题的新想法。
有传统的方法:
#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>
和某种二叉树来为你做这件事 - 对我来说,从上到下更有意义,因为我们试图在技术上将一个数字划分或划分为更小的数字;算法可能有点复杂,但当你完成它时,也可以显示一棵树。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 根据 C++ 中的属性对对象类进行分区的优化方法
- 迭代快速排序方法的分区算法问题
- 找到分区数组的方法数量
- 按顺序生成数字分区的不同方法