最小硬币更换问题(自上而下方法)

Minimum Coin Change Problem(Top-Down Approach)

本文关键字:自上而下 方法 问题 硬币      更新时间:2023-10-16

我已经编写了一个自上而下的方法来解决下面代码中所示的著名的最小零钱问题。但当资金接近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];
}

也许你可以通过这样做来减少搜索树的深度:

假设你有一组C={c1,…,cn}的N个硬币,按其值的降序排序,其权重分别为X={x1,…,xn}

我们试图最小化Sum_{1<=i<=N}

假设我们试图最小化xi的和,任何形式的解S=+慈溪++cjxj+。。。其中xj>ci和i<j由形式为S’=…的解支配+ci(xi+cj(++cj(xj-ci(+。。。

通过推广,主解的形式是xj<(ci-1(对于每1<i<j<N、 并且甚至更具限制性的xj<(ci/gcd(ci,cj((-1用于每1<i<j<N(有人得到这个或下面其他任何东西的参考吗?(

我们通过这种方式获得了X的上界向量U,其中xi<ui每1<i<N在向量U中,u1是无限的,并且所有其他值都是有界的;因此,我们可以很容易地计算出最大值Z=\Sum_

通过扩展,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阵列更小。