C++ 给定一组不同高度的堆栈,如何选择所有可能的组合?

C++ 给定一组不同高度的堆栈,如何选择所有可能的组合?,c++,arrays,algorithm,stack,C++,Arrays,Algorithm,Stack,输入:总成本 输出:给出所需成本的所有级别组合 每个堆栈的每个级别的成本都不同(堆栈1中的级别1的成本与堆栈2中的级别1的成本不同)。我有一个函数,可以根据我手动输入(硬编码)的基本成本(级别1)将级别转换为实际成本 我需要找到给我输入成本的级别组合。我意识到有不止一种可能的解决方案,但我只需要一种方法来迭代每一种可能性 以下是我需要的: 输入=224,这是解决方案之一: 我正在做一个简单的程序,需要选择不同层次的堆栈,然后计算成本,我需要知道存在的每一个可能的成本。。。每个堆栈的每个级别的

输入:总成本

输出:给出所需成本的所有级别组合

每个堆栈的每个级别的成本都不同(堆栈1中的级别1的成本与堆栈2中的级别1的成本不同)。我有一个函数,可以根据我手动输入(硬编码)的基本成本(级别1)将级别转换为实际成本

我需要找到给我输入成本的级别组合。我意识到有不止一种可能的解决方案,但我只需要一种方法来迭代每一种可能性

以下是我需要的:

输入=224,这是解决方案之一:


我正在做一个简单的程序,需要选择不同层次的堆栈,然后计算成本,我需要知道存在的每一个可能的成本。。。每个堆栈的每个级别的成本都不同,但这不是问题所在,问题在于如何为每个堆栈选择一个级别

我可能解释得很含糊,所以这里有一张图片(你得原谅我绘画技巧差):

所以,所有的堆栈都有0级,0级总是花费0美元

其他信息:

circ(currentStack)
{
    for (i = 0; i <= allStacks[currentStack]; i ++)           
       if (currentStack == lastStack && i == allStacks[currentStack])
           return 0;
       else if (currentStack != lastStack)
           circ(++ currentStack);
}
  • 我有一个名为“maxLevels”的数组,该数组的长度是堆栈的数量,每个元素是该堆栈中最高级别的数量(例如,maxLevels[0]==2)
  • 您可以从第一个级别进行迭代,因为级别0根本不重要
  • 所选级别应保存在一个数组中(名称:“CurrentLevel”),该数组类似于MaxLevel(相同长度),但它不包含堆栈的最大级别,而是包含堆栈的所选级别(例如:CurrentLevel[3]==2)
  • 我在C++中编程,但是伪代码也很好。
  • 这不是作业,我只是为了好玩(基本上是为了游戏)

我不确定我是否理解这个问题,但下面是如何从每个堆栈中选择一个项目的所有可能组合(在本例中,3*1*2*3*1=18种可能性):

void visit\u每个\u组合(大小\u t*maxLevels、大小\u t数量\u堆栈、访问者和访问者、std::vector和choices \u至今为止){
if(堆栈的数量==0){
访客访问(迄今为止的选择);
}否则{

对于(size_t pos=0;pos我不确定我是否理解这个问题,但下面是如何从每个堆栈中选择一个项目的所有可能组合(在本例中,3*1*2*3*1=18种可能性):

void visit\u每个\u组合(大小\u t*maxLevels、大小\u t数量\u堆栈、访问者和访问者、std::vector和choices \u至今为止){
if(堆栈的数量==0){
访客访问(迄今为止的选择);
}否则{

对于(size_t pos=0;pos如果我理解正确,这非常简单。最小成本是0,最大成本只是堆栈高度的总和。要实现这些限制之间的任何特定成本,可以从左侧开始,为每个堆栈选择最大级别,直到达到目标,然后为每个堆栈选择级别0剩余堆栈。(如果超出目标,可能需要调整最后一个非零堆栈。)

如果我理解正确,这很简单。最低成本是0,最高成本只是堆栈高度的总和。要实现这些限制之间的任何特定成本,您可以从左侧开始,为每个堆栈选择最大级别,直到达到目标,然后为剩余的堆栈选择级别0确认。(如果超出目标,可能必须调整最后一个非零堆栈。)

我想我解决了它。@Steve Jessop给了我使用递归的想法

算法:

circ(currentStack)
{
    for (i = 0; i <= allStacks[currentStack]; i ++)           
       if (currentStack == lastStack && i == allStacks[currentStack])
           return 0;
       else if (currentStack != lastStack)
           circ(++ currentStack);
}
circ(currentStack)
{

对于(i=0;i我想我解决了它。@Steve Jessop给了我使用递归的想法

算法:

circ(currentStack)
{
    for (i = 0; i <= allStacks[currentStack]; i ++)           
       if (currentStack == lastStack && i == allStacks[currentStack])
           return 0;
       else if (currentStack != lastStack)
           circ(++ currentStack);
}
circ(currentStack)
{

对于(i=0;我已经把这个问题重读了好几遍,现在很难理解。你能提供一个具体的例子,说明输入、输出以及计算输出所采取的步骤吗?我不相信你能从中得到任何东西……只有输入是成本,每个堆栈的每一层加起来都有一点,所以程序是正确的任务是找到不同级别的确切组合,使其与成本匹配。我马上回来编辑问题!
(CurrentLevel[0]+CurrentLevel[1]+CurrentLevel[2]+…)==要求的成本
这是你想要实现的吗?或者5级的成本可能与5级不同吗?我不明白这一点,所以我倾向于投票结束,因为这不是一个真正的问题。然而,也许其他人会给出一个答案。看在上帝的份上,你能告诉我们这个问题是什么吗?@bane你想问算法吗这会产生所有可能的成本,给定堆栈的当前配置和每个堆栈中每个项目的成本?或者你会要求给定一个成本值和给定堆栈配置的算法,每个项目的成本会产生生成给定成本值的堆栈选择?我已经重复阅读了好几次,现在是很难理解。你能提供一个具体的例子,展示输入、输出以及计算输出所采取的步骤吗?我不相信你能从中得到任何东西……只有输入是成本,每个堆栈的每个级别加起来都有一点,所以程序的任务是找到不同级别的精确组合,以便匹配成本。我马上回来编辑问题!
(currentLevels[0]+currentLevels[1]+currentLevels[2]+…)==要求的成本
这是你想要实现的吗?或者第5级的成本可能与第5级不同吗?我不理解这一点,所以我倾向于投票结束,因为这不是一个真正的问题。然而,也许有人会