我是递归和回溯的新手。我知道在继续进行动态编程之前,我需要完全熟悉这些概念。我在下面编写了一个程序,该程序可以帮助我找到给定数量n和无限数量的硬币的所有可能组合。但是,我希望我的程序为我提供独特的解决方案。我很难弄清楚该怎么做。
我在这里找到了一个资源:Coin Change,该资源递归使用自顶向下方法,然后使用以下公式对其进行修改以提供不同的组合:count(s,n,total)= count(s,n, total-s [n])+ count(s,n-1,total)
这表示我使用该值递归,然后递归排除该值并将硬币减少1。
我似乎无法理解它是如何工作的。我也可以肯定地说,在每次谈话时甚至很难在现场想到这样一种技术。在某个问题上似乎有人不得不花大量时间来设计这种技术。
无论如何对我如何将程序转换为打印不同的解决方案及其工作方式的任何帮助,都将受到感激。
David
使用纯递归穷举技术(以下代码),数量{1、2、5}和N = 10的非唯一有效组合的实际数量为128。
我的问题是,可以通过记忆/动态编程来改进详尽的搜索。如果是这样,我该如何修改以下算法以结合此类技术。
答案 0 :(得分:1)
简单的修改可以避免重复。
使用排序的amounts
数组。
循环的起始值应排除amounts
中的先前值。
我使用了count
参数(似乎未使用)
for(int i=count;i<amounts.length;i++) {
sum = sum + amounts[i];
combo[index] = amounts[i];
ways(n, amounts, combo, i, sum, index + 1);
sum = sum - amounts[i];
}
答案 1 :(得分:0)
positions