我正在尝试找到coin change problem的所有可能解决方案。
示例:我有可用的硬币1和2,我想要更改6。
正确解决方案: [1,1,1,1,1,1],[2,1,1,1,1,0],[2,2,1,1, 0,0],...
我的代码: [1,1,1,1,1,1],[1,1,1,1,0,0],[1,1,0,0, 0,0],...
最后一行还会删除我的参数“coinsSoFar”,我不明白为什么。当我调试时,它将temp设置为[0,0,0,0,0,0] AND coinsSoFar为[0,0,0,0,0,0],它应该保持在[2,0,0,0, 0,0]。
非常感谢您的帮助。 (clearArray:所有数字都设置为0; addToArray:将前0替换为数字)
public static void makeChange(int amount, int startCoinIndex, int[] coinsSoFar) {
if (amount == 0) {
System.out.println(Arrays.toString(coinsSoFar));
}
if (startCoinIndex == coinSet.length || amount < 0) {return;}
for (int i = 0; i * coinSet[startCoinIndex] <= amount; i++) {
int[] temp = coinsSoFar;
for (int j = 0; j < i; j++) {
addToArray(temp, coinSet[startCoinIndex]);
}
makeChange(amount - i * coinSet[startCoinIndex], startCoinIndex+1, temp);
clearArray(temp); // this line also clears coinsSoFar. Why?
}
}
答案 0 :(得分:1)
当你这样做时
ul {
list-style-type: none;
padding: 0;
margin-bottom: 15px;
}
li {
padding-left: 10px;
padding-bottom: 0.1em;
text-indent: -.5em;
}
li:before {
content: "– ";
color: #333;
}
您正在设置temp以引用与int[] temp = coinsSoFar;
相同的数组。因此,您对coinsSoFar
所做的任何事情都会影响temp
。
如果您希望coinsSoFar
引用temp
的副本,请执行以下操作:
coinsSoFar
答案 1 :(得分:0)
您使用clearArray(temp, 0)
清除原始数组 - 按引用传递。
调用int[] temp = coinsSoFar;
您不会创建数组的副本,而是创建对同一数组的引用。
也应该是|| amount <= 0