我已经编码了一种自顶向下的方法来解决著名的minimum coin change problem,如下面的代码所示。但是当钱接近44000时,代码就会遇到分段错误。我有三种硬币{1,4,5}。我不知道怎么回事?我怀疑我的堆栈内存不足。但是44000似乎很小。因此,我在在线IDE上进行了测试。但它似乎在这里完美地工作。我在NetBeans 8.2(8GB RAM的笔记本电脑)上运行代码。请帮我 以下是我的功能的代码段:
//A top-down approach
int change_tpd(int m, vector<int>&coins, vector<int>&dp)
{
if(dp[m]!=-1)
return dp[m];
else if(m==0)
dp[m] = 0;
else
{
int x = INT_MAX;
for(int i=0;i<coins.size();++i)
{
if(m-coins[i]>=0)
x = min(x,change_tpd(m-coins[i],coins,dp));
}
dp[m] = 1+x;
}
return dp[m];
}
答案 0 :(得分:0)
也许您可以通过执行以下操作来减少搜索树的深度:
假设您有一个C = {c1,...,cn}个N个硬币的集合,按其值的降序排列,权重X = {x1,...,xn}
我们正在尝试最小化Sum_ {1 <= i <= N} {xi},其中Prod_ {1 <= i <= N} {ci * xi} = V
鉴于我们试图最小化xi的和,任何形式为S = ... + cixi + ... + cjxj + ...的解,其中xj> = ci且i 通过扩展,对于每1 <= i 我们以这种方式获得每1 <= i <= N的xi <= ui的X的上限向量U。
在向量U中,u1是无限的,所有其他值都是有界的;结果,我们可以轻松计算出最大值Z = \ Sum_ {2 <= i <= N} {ci * ui},而无需使用任何硬币c1作为主导解,我们就可以得出 通过扩展,可以将V> Z的分辨率减小为V'= V-ip((V-Z + c1-1)/ c1)* c1,其中ip(r)是r的整数部分,并通过将结果增加ip((V-Z + c1-1)/ c1)。 在您的情况下,C = {5,4,1},Z = 19;
V = 44000> Z,V'= 44000-ip((44000-17)/ 5)* 5 = 15,结果加8797 这也使DP阵列更小。