[英]Segmentation fault in recursive program
我在做硬幣問題,問題說,
給定一組硬幣值
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;
}
代碼取自:
#include <iostream>
using namespace std;
int minCoins(int coins[], int m, int amount) {
if (amount == 0) return 0;
int res = INT_MAX;
for (int i = 0; i < m; i++) {
if (coins[i] <= amount) {
int sub_res = minCoins(coins, m, amount - coins[i]);
if (sub_res != INT_MAX && sub_res + 1 < res) { // avoid overflow
res = sub_res + 1;
}
}
}
return res;
}
int main() {
int coins[] = { 6, 5, 1 };
int amount = 9;
cout << "Min coins is "
<< minCoins(coins, sizeof(coins) / sizeof(coins[0]), amount)
<< endl;
return 0;
}
關於問題:
您的分段錯誤來自以下行: best = min (best, solve (x - i, a, n) + 1);
原因是: xi
總是會給你相同的值,所以如果你在沒有調試的情況下運行程序,你的程序就會崩潰。 所以不要嘗試調試它,因為看到這個崩潰需要很長時間。 對於初學者更改為: best = min (best, solve (x - a[i], a, n) + 1);
.
修復第1節后,if case: if (x < 0) return INT_MAX;
將導致問題並且將始終返回相同的值,即: -INT_MAX
。 所以你需要再次檢查“if case”。
您嘗試實現的算法不正確,請參見該算法的偽代碼:
minchange(M): if M = 0: return 0 v <- infinity for c in denominations <= M: v <- min { minchange(M - c) + 1, v } return v
更好地使用: sizeof(a) / sizeof(a[0])
而不是int n = 3
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.