问题:找到切割长度为n的杆的最佳方法 每个切割是整数长度 假设每个长度i杆的价格为p(i) 给定:长度为n的杆,以及价格列表p,它提供了0到n之间每个可能整数长度的价格。
找到最佳切割量以获得最高价格 可以使用任意数量的切割,从0到n-1 切割没有任何费用。
下面我提出了一个针对这个问题的天真算法。
CUT-ROD(p,n)
if(n == 0)
return 0
q = -infinity
for i = 1 to n
q = max(q, p[i]+CUT-ROD(p,n-1))
return q
如何证明此算法是指数的?一步步。 我可以看出它是指数级的。但是,我无法证明它。
答案 0 :(得分:0)
为了清晰起见,我们将代码翻译成C ++:
int prices[n];
int cut-rod(int n) {
if(n == 0) {
return 0;
}
q = -1;
res = cut-rod(n-1);
for(int i = 0; i < n; i++) {
q = max(q, prices[i] + res);
}
return q;
}
注意:我们正在缓存结果of cut-rod(n-1)
,以避免不必要地增加算法的复杂性。在这里,我们可以看到cut-rod(n)
调用cut-rod(n-1)
,调用cut-rod(n-2)
等等,直到cut-rod(0)
。对于cut-rod(n)
,我们看到函数迭代数组n
次。因此,算法的时间复杂度等于O(n + (n-1) + (n-2) + (n-3)...1)
= O(n(n+1)/2)
,大约等于O((n^2)/2)
。
修改强> 如果我们使用与问题中的算法完全相同的算法,则其时间复杂度为O(n!),因为cut-rod(n)称切割杆(n-1)n次。切杆(n-1)称切杆(n-2)n-1次,依此类推。因此,时间复杂度等于O(n *(n-1)*(n-2)... 1)= O(n!)。