【发布时间】:2020-11-30 03:35:02
【问题描述】:
我在做硬币问题,问题是这样说的,
给定一组硬币值
coins = {c1, c2,..., ck}和一个目标总和 钱n,我们的任务是用尽可能少的硬币来形成总和n可能。
假设您有 9 美元,并且您有一组 {6,5,1},那么,最小数量。 9 美元的总和/零钱将是( 6+1+1+1=9),即4。
我尝试使用这个公式递归地做:
solve(x) = min( solve(x−6)+1, solve(x−5)+1, solve(x−1)+1 )
,但我不知道为什么我的代码中出现分段错误。
网上有很多代码,但我想知道我在这里做错了什么,我是递归新手,请帮助我,代码在这里:
//my code
#include<bits/stdc++.h>
using namespace std;
int solve (int x, int a[], int n)
{
if (x < 0)
{
return INT_MAX;
}
if (x == 0)
{
return 0;
}
int best = INT_MAX;
for (int i = 0; i < n; i++)
{
best = min (best, solve (x - a[i], a, n) + 1);
}
return best;
}
int main ()
{
int a[] = { 6, 5, 1 };
int x = 9;
int n = 3;
cout << solve (x, a, n);
return 0;
}
【问题讨论】:
-
你试过调试你的代码吗?
-
立即引起了我的注意:您从未在递归函数中触摸过
a——感觉不对。 -
solve (x - i, a, n)应该是solve (x - a[i], a, n)。但可能还有其他一些问题。solve在某些情况下返回INT_MAX。你给它加1。你知道会发生什么吗?对于有符号值,行为未定义。 -
@ThomasSablik 其实this 有一个不错的调试器。
标签: c++ recursion segmentation-fault coin-change