最小硬币更换问题(自上而下方法)
Minimum Coin Change Problem(Top-Down Approach)
我已经编写了一个自上而下的方法来解决下面代码中所示的著名的最小零钱问题。但当资金接近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阵列更小。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 此动态编程问题的自上而下方法
- 此解决方案中生成更改的方法数量(自上而下)有什么问题?