如何将长度拆分为子长度组合(带有特殊允许子长度列表)

时间:2013-07-16 12:14:44

标签: algorithm

背景是,我需要将绘制的长度分割成有效的子部分,而绘制时我还需要捕捉到下一个可能的长度。

例如,我知道有效的零件长度为[400,700,100 - 1500,十分之一]

会产生3条规则:

  • 规则1:值可以是400
  • 规则2:价值可以是700
  • 规则3:价值可以是1200,1210,1220,...... 1490,1500

示例1

我绘制了1500的长度,我可以用两种方式分割它:

  • 方式1:2x 400 + 1x 700
  • 方式2:1x 1500

示例2

我绘制了1150的长度,我无法将其拆分为有效的子部分

=>没有可能的解决方案...最接近可能的长度:1100或1200,假设我们更喜欢较小的那个

1100只能以一种方式分割

  • 1x 700 + 1x 400

所以我总是想找到

  • 1)下一个最佳长度和
  • 2)所有可能的组合

创建此长度。

如何解决这个问题?最后,我想找出组合子部件以获得总长度的可能方法。

目标:

我最终的目标是找到下一个最佳长度以及与最少(最长)子部分的组合,可以合并到这个长度......

2 个答案:

答案 0 :(得分:0)

天真的解决方案:递归。您可以应用规则1,也可以不应用规则1。因此,对于输入1700,要么应用规则1(剩余:1300),要么不应用(剩余:1700,不能再使用规则1)

答案 1 :(得分:0)

据我所知,这个问题与变革问题密切相关。您的“有效部分”是硬币,您的长度是要给出的总变化。有几种方法可以解决这些问题,其中包括动态编程和贪婪方法(根据问题的特殊性,一种可能比另一种更好。) 变革问题基本上是“如何使用尽可能少的硬币获得所需的金额,给定可能的硬币”。它在许多在线文档中都有描述。