【发布时间】:2013-06-21 03:39:45
【问题描述】:
{1,3,5} 面额硬币;总和 = 11。 找到可用于计算总和的最小硬币数量 (我们可以使用任意数量的每种面额的硬币)
我搜索了这个硬币变化问题的运行时间复杂度,特别是使用动态编程方法。但无法在任何地方找到解释。
如何计算非动态解决方案的复杂度,然后将其更改为动态解决方案? (不是贪婪的)
编辑:
这是一个要求分析的实现。
public int findCoinChange(int[] coins, int sum,int count) {
int ret = 0, maxRet = -1;
if(sum ==0)maxRet = count;
else if(sum < 0)maxRet = -1;
else{
for(int i:coins){
ret = findCoinChange(coins, sum - i,count+1);
if(maxRet< 0)maxRet = ret;
else if(ret >=0 && ret < maxRet){
maxRet = ret;
}
}
}
if(maxRet < 0)return -1;
else return maxRet;
}
对我来说看起来像是组合爆炸。但是我不确定如何为此推断运行时间复杂度。
【问题讨论】:
-
我认为贪婪不会解决这个问题。
-
thefourtheye - 贪婪并不总是提供最佳解决方案,例如Sum=9;{1,4,5} 贪心会给出 - {5,1,1,1,1} 最优是 {4,4}
-
@arpitgautam 正确。我正是这个意思。如果一个程序对某些输入有效而对其他输入失败,则它不会被视为正确的程序。所以贪心是行不通的。您在评论中的示例应为 {4, 5}
-
对,打错字了。
标签: algorithm