我正在努力理解这个问题:
给你一块长方形布,尺寸为 X 乘 Y,其中 X 和 Y 是正整数,以及可以使用该布制作的 n 个产品的列表。对于 [1,n] 中的每个产品 i,您知道需要一个尺寸为 ai×bi 的矩形布,并且该产品的最终售价为 ci。假设 ai、bi 和 ci 都是正整数。您有一台机器可以将任何矩形布片水平或垂直切成两块。设计一种算法,找到切割 X 乘 Y 块布的最佳策略,以便由所得块制成的产品给出最大的销售价格总和。您可以随意制作任意数量的给定产品副本,如果需要,也可以不制作。
尽管我实际上已经正确地实现了动态编程解决方案,但我很难理解/证明为什么一个简单的问题解决方案会在指数时间内运行。我认为这首先表明对指数算法缺乏了解,但我现在主要关心的是上述情况。
我知道动态编程解决方案允许我通过记忆我已经完成的工作来节省工作。动态规划的运行时间应该是 O((W*H)(n+w+h)) 或 O(n^3)/多项式。这是因为我正在尝试每个可能的布片宽度和高度。对于每个可能的布块宽度和高度,我尝试每种可能的垂直、水平和块尺寸切割。(我也有点困惑,为什么 n 在时间复杂度中是必要的,因为如果你尝试每一个可能的水平和垂直切割,也应该尝试每一个可能的部分)。
如果我关闭了记忆,那应该给我蛮力方法,这涉及解决整个树。这应该是多项式或 O(2^n)。为什么?具有 O(2^n) 时间复杂度的算法不应该由二叉树表示吗?看起来这个问题的天真的解决方案不会是二元的。