Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在硬币兑换中添加回忆录_C++_Dynamic Programming - Fatal编程技术网

C++ 如何在硬币兑换中添加回忆录

C++ 如何在硬币兑换中添加回忆录,c++,dynamic-programming,C++,Dynamic Programming,我在看硬币兑换的乐谱。我想出了一个蛮力解决方案,并对如何添加回忆录有了一些想法,但看起来我遗漏了一些东西。下面是我的非记忆功能 我最初考虑创建一个hashmap,它存储向量、索引和sum的元组,并针对它存储相应的sum值,我在基本情况下使用它。但是干运行它,它看起来不正确 非常感谢任何提示/帮助 void minCoins_Helper2(std::vector<int> coins, int sum, int index, int currCoins, int &min){

我在看硬币兑换的乐谱。我想出了一个蛮力解决方案,并对如何添加回忆录有了一些想法,但看起来我遗漏了一些东西。下面是我的非记忆功能

我最初考虑创建一个hashmap,它存储向量、索引和sum的元组,并针对它存储相应的sum值,我在基本情况下使用它。但是干运行它,它看起来不正确

非常感谢任何提示/帮助

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;
}
void minCoins\u Helper2(标准::向量硬币、整数和、整数索引、整数货币硬币、整数和分钟){
//基本情况
如果(索引==coins.size())
返回;
如果(总和<0)
返回;
如果(总和=0){
如果(货币<分钟)
最小=货币;
返回;
}
//包括硬币
minCoins_Helper2(硬币,总和-硬币[索引],索引,货币硬币+1,分钟);
//不包括硬币
minCoins_Helper2(硬币,总和,索引+1,货币,分钟);
}
整数最小硬币2(标准::矢量硬币,整数和){
int min=int_MAX;
minCoins_Helper2(coins,sum,0,0,min);;
返回最小值;
}

您不需要存储硬币矢量

在这个问题中,你只需要有一个二维数组,比如
dp[i][j]
,其中
i
是你的和,
j
是你的索引

minCoins\u helper2
的末尾,在递归调用之后,您必须存储dp[sum][index],其中至少有两个递归调用的应答


然后在
//包括硬币的顶部
你应该检查一下,如果你以前计算过dp[sum][index],那么不要递归调用它来节省时间。

我认为你应该详细说明你的答案。这个问题不需要二维数组。你能更具体地说明你缺少了什么吗?您尝试了什么,尝试时哪些不起作用?(据我所知,要求他人为您编写代码在这里是不恰当的。)通常动态编程问题的解决方案都有重叠的子问题。在子问题解决后,记录子问题的解决方案,这样子问题只需解决一次。您使问题变得有点棘手,因为您没有真正将问题分解为子问题,因为您通过每个递归调用向下传递已使用硬币的数量。如果您重写helper函数以返回最佳值,那么添加memonization将非常简单。@mwistrom-我想我知道您的意思。添加备忘录应该很简单,但上面我的递归工作方式确实使它复杂化了。我用自下而上的方法解决了这个问题,但仍在尝试找出记忆解决方案。无论如何,谢谢你。