让我们假设我们现在正在解决一个可以通过动态编程解决的典型问题 - 获取可能的硬币组合数量以进行更改。
Memorizer mem = new Memorizer();
int[] coins = { 100000, 8534, 5935, 291, 76, 51, 30, 29, 7, 5 }
......
int getNum(int money, int idx) {
if(idx == coins.length - 1) {
if(money % coins[idx] == 0)
return 1;
else
return 0;
}
int found = mem.find(money, idx);
if(found != null)
return found;
int num = 0;
for(int i = 0; i <= (money / coins[idx]); i++)
num += getNum(money - i * coins[idx], idx + 1);
mem.remember(money, idx, num);
return num;
}
但如果钱很大,比如2,000,000,000,那么很难记住所有的中间结果。如何通过非常大的输入解决问题?请帮我。谢谢。
答案 0 :(得分:0)
这个dp有问题,应该是:
if(money % coins[idx] == 0)
return money/coins[idx];
话虽这么说,在你拿到钱之前循环上一个硬币价值是不错的主意,而是循环所有的硬币价值。这样,num [x] = min(num [x-coin [i]] + 1,num [x])。
在这段代码中,我们可以在数组的一部分上使用记忆,即最后{最大值的硬币}元素,因为,你只需要记住x-coin [i]。如果它正在寻找,请尝试弄清楚如何实现它。