输入总费用。
输出:提供所需费用的所有级别组合。
每个堆栈的每个级别花费不同的金额(堆栈1中的级别1与堆栈2中的级别1的成本不同)。我有一个功能,根据基本成本(级别1)将级别转换为实际成本,我手动输入(硬编码)。
我需要找到能够让我获得投入成本的等级组合。我意识到有多种可能的解决方案,但我只需要一种方法来迭代各种可能性。
这就是我需要的:
input = 224,这是解决方案的一个:
我正在制作一个简单的程序,需要选择不同堆栈的级别,然后计算成本,我需要知道存在的每一个可能的成本...每个堆栈的每个级别花费不同的金额,但这不是问题,问题是如何为每个堆栈选择一个级别。
我可能非常模糊地解释了这一点,所以这是一张图片(你将不得不原谅我糟糕的绘画技巧):
因此,所有堆栈的级别为0,级别0的总成本为0。
其他信息:
答案 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)
<强>算法:强>
circ(currentStack)
{
for (i = 0; i <= allStacks[currentStack]; i ++)
if (currentStack == lastStack && i == allStacks[currentStack])
return 0;
else if (currentStack != lastStack)
circ(++ currentStack);
}