我正在看找零硬币的Leetcode problem。我想出了一种蛮力的解决方案,并对如何添加备忘录有一些想法,但是看起来我缺少了一些东西。下面是我的非记忆功能。
我最初是在考虑创建一个哈希表,该哈希表存储一个向量,索引和和的元组,并为其存储一个对应的和值,在基本情况下使用它。但是试运行它,看起来不正确。
任何提示/帮助都非常感谢。
void minCoins_Helper2(std::vector<int> coins, int sum, int index, int currCoins, int &min){
// Base cases
if(index == coins.size())
return;
if(sum < 0)
return;
if(sum == 0){
if(currCoins < min)
min = currCoins;
return;
}
// Include the coin
minCoins_Helper2(coins, sum - coins[index], index, currCoins+1, min);
// Exclude the coin
minCoins_Helper2(coins, sum, index+1, currCoins, min);
}
int minCoins2(std::vector<int> coins, int sum){
int min = INT_MAX;
minCoins_Helper2(coins, sum, 0, 0, min);;
return min;
}
答案 0 :(得分:0)
您不需要存储硬币向量。
在这个问题中,您只需要一个二维数组,例如dp[i][j]
,其中i
是您的总和,j
是您的索引。
在minCoins_helper2
的末尾,在递归调用之后,您必须存储dp [sum] [index],其中最少应包含两次递归调用。
然后在// include the coins
的顶部检查一下,如果以前已经计算过dp [sum] [index],那么不要递归调用它以节省时间。