如何为硬币找零添加便笺

时间:2018-08-10 02:14:22

标签: c++ dynamic-programming

我正在看找零硬币的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;
}

1 个答案:

答案 0 :(得分:0)

您不需要存储硬币向量。

在这个问题中,您只需要一个二维数组,例如dp[i][j],其中i是您的总和,j是您的索引。

minCoins_helper2的末尾,在递归调用之后,您必须存储dp [sum] [index],其中最少应包含两次递归调用。

然后在// include the coins的顶部检查一下,如果以前已经计算过dp [sum] [index],那么不要递归调用它以节省时间。