【发布时间】:2019-12-21 14:18:54
【问题描述】:
我有一个任务是解决硬币找零问题,如下所示: 我有 5 种硬币 {1,5,10,25,50},我们想用这些硬币换成给定的金额,例如,我可以用多少种方式形成 11 美分,或 n 美分一般的 ?我的程序应该能够处理高达 7489 美分的输入。
我使用递归和动态编程来解决问题,但在运行时 (input >= 3980) 出现堆栈溢出错误
我该如何解决这个错误?
#include <iostream>
using namespace std;
typedef long long ll;
int Cents[5] = { 1,5,10,25,50 }, in, mem[5][7495];
ll CC(int i, int val) { // this is where the recursion happens
if (val == 0) return 1;
if (i == 5) return 0;
if (mem[i][val] != -1) return mem[i][val];
long long op1 = CC(i + 1, val);
long long op2 = Cents[i] <= val ? CC(i, val - Cents[i]) : 0;
return mem[i][val] = (op1+op2);
}
int main() { // here i pass an input and fill the mem 2d array with -1's
scanf_s("%d", &in);
memset(mem, -1, sizeof mem);
printf("%lld\n", CC(0, in));
system("pause");
return 0;
}
例如,如果输入是 5,那么输出应该是 2 路 (1),(5) 如果 11 ,则 4 (1*11),(1*6,5*1),(10*1,1*1),(1*1,5*2) 等等。
【问题讨论】:
-
两种解决方案:1)使用自下而上的方法,而不是自上而下。 2)检查有关命令行参数的课程说明。它们的堆栈大小可能大于默认值(例如,请参阅此答案:stackoverflow.com/a/2275586/2956272)。
-
输入
n的递归深度与n成正比,因为您试图更改n便士。这样的做法是不合理的。 -
memset(mem, -1, sizeof mem)将mem中的每个 byte 设置为 -1。不能保证这将导致mem数组中的每个int值都具有值 -1。 -
您的作业是否要求您使用递归?在循环中进行计算更简单、更灵活。
标签: c++ recursion dynamic-programming stack-overflow