我正在努力理解这个问题:
您将得到一块尺寸为X×Y的矩形布料,其中X和Y为正整数,以及可以使用布料制作的n个产品列表。对于[1,n]中的每个产品,您知道需要一个尺寸为ai by bi的矩形布料,并且该产品的最终销售价格为ci。假设ai,bi和ci都是正整数。你有一台机器可以将任何矩形布块水平或垂直切成两块。设计一种算法,找到切割X×Y布料的最佳策略,以便由最终产品制成的产品给出最大的销售价格总和。您可以根据需要自由制作给定产品的副本,如果需要,也可以不制作。
虽然我实际上已经正确地实现了动态编程解决方案,但我很难理解/证明为什么这个问题的天真解决方案会在指数时间内运行。我认为这首先表明对指数算法缺乏了解,但我现在主要关注的是上述情况。
我知道动态编程解决方案允许我通过记忆我已经完成的工作来节省工作。具有动态编程的运行时应该是O((W * H)(n + w + h))或O(n ^ 3)/多项式。这是因为我正在尝试布料的每个可能的宽度和高度。对于每个可能的布料宽度和高度,我尝试每个可能的垂直,水平和片大小的切割。 (我也有点困惑,为什么n在时间复杂度上是必要的,因为如果你尝试每一个可能的水平和垂直切割,也应该尝试每一个可能的部分。)
如果我关闭了memoization,那应该给我一个暴力方法,这涉及解决整个树。这应该是多项式或O(2 ^ n)。为什么?具有O(2 ^ n)时间复杂度的算法是不是应该由二叉树表示?看起来这个问题的天真解决方案不是二元的。
答案 0 :(得分:1)
线性优化
使用Linear Programming \ Optimization with,
时间:O(n)
空间:O(1)
动态编程
解决k变量问题可以通过动态编程\优化来完成,
时间:对于i:1..k,O(Π{Si} * T(ΔIj)* c),其中Si是第i个可变域大小,Ij是第j个输入大小,c是“常数“对于模型中的计算次数
空间:O(Π{Si})基本上需要存储是| S |维矩阵
<强>讨论:强>
〜基本上你提到的是2变量的情况,简单动态规划的最佳版本解决2个变量中的问题将具有O((W * H)(n + w + h)的计算时间复杂度))或通常O(3 ^ n)“输入大小一般化为n”
〜我曾经使用Viterbi动态规划算法在隐马尔可夫模型(存储为3D矩阵)上使用概率N-gram max-min函数编写语言学相似性库
〜如果你有兴趣,它是用Java编写的:download
来源:
答案 1 :(得分:0)
这个问题听起来像是背包问题的衍生物(即,在给定的空间量内获得尽可能多的价值)。考虑到这一点,看看here。有一节解释了天真的解决方案(并用二叉树表示),并显示了重叠的子问题。
如果你不明白你的问题与背包问题是一样的,你应该从那里开始。
答案 2 :(得分:0)
帮助了解为什么它是2 ^ n(二叉树),想到可能的削减为是/否决定:我在这里切?还是在这?还是在这?每个是/否二元决策都会产生必须检查的可能性子树。
这个问题没有表达为二叉树的原因是因为我们只对叶子感兴趣。具体来说,在最佳叶片中。从根到叶子的路径是最佳切割的解决方案。树本身就是可能的解决方案空间。