给定一组不同高度的堆栈,我如何选择可能的每个组合?

时间:2011-12-22 11:01:46

标签: c++ arrays algorithm stack

输入总费用。

输出:提供所需费用的所有级别组合。

每个堆栈的每个级别花费不同的金额(堆栈1中的级别1与堆栈2中的级别1的成本不同)。我有一个功能,根据基本成本(级别1)将级别转换为实际成本,我手动输入(硬编码)。

我需要找到能够让我获得投入成本的等级组合。我意识到有多种可能的解决方案,但我只需要一种方法来迭代各种可能性。

这就是我需要的:

input = 224,这是解决方案的一个these are the costs


我正在制作一个简单的程序,需要选择不同堆栈的级别,然后计算成本,我需要知道存在的每一个可能的成本...每个堆栈的每个级别花费不同的金额,但这不是问题,问题是如何为每个堆栈选择一个级别。

我可能非常模糊地解释了这一点,所以这是一张图片(你将不得不原谅我糟糕的绘画技巧):

these are the maximum levels

因此,所有堆栈的级别为0,级别0的总成本为0。

其他信息:

  • 我有一个名为“maxLevels”的数组,该数组的长度是堆栈数,每个元素是该堆栈中最高级别的数字(例如,maxLevels [0] == 2)。
  • 您可以从第1级进行迭代,因为级别0根本不重要。
  • 选定的级别应保存在一个类似于maxLevels(相同长度)的数组中(名称:“currentLevels”),但它不包含堆栈的最大级别,而是包含所选的堆栈级别(例如:currentLevels [3] == 2)。
  • 我用C ++编程,但伪代码也很好。
  • 这个不是作业,我是为了好玩而做的(基本上是为了游戏)。

3 个答案:

答案 0 :(得分:3)

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

void visit_each_combination(size_t *maxLevels, size_t num_of_stacks, Visitor &visitor, std::vector<size_t> &choices_so_far) {
    if (num_of_stacks == 0) {
        visitor.visit(choices_so_far);
    } else {
        for (size_t pos = 0; pos <= maxLevels[0]; ++pos) {
            choices_so_far.push_back(pos);
            visit_each_combination(maxLevels+1, num_of_stacks-1, visitor, choices_so_far);
            choices_so_far.pop_back();
        }
    }
}

您可以将visitor.visit替换为您想要对每个组合执行的任何操作,以使代码更具体。我使用了向量choices_so_far而不是数组currentLevels,但它也可以使用数组。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

我认为,我解决了这个问题。 @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);
}