这个代码会导致栈溢出?

yakeMili 2020-03-08 04:09:03
刷算法题时遇到一个完全看不明白的问题,
算法题就是给你一些硬币种类,然后用最少的硬币凑够某个金额。
https://leetcode-cn.com/problems/coin-change/
我写完代码测试的时候有一个我自己写的测试总是过不去,即使我从解题上复制过来的答案也跑不过我写的这个数据。
详细的代码如下,给出的代码是标准的解题答案。

class Solution {
vector<int>count;
int dp(vector<int>& coins, int rem) {
if (rem < 0) return -1;
if (rem == 0) return 0;
if (count[rem - 1] != 0) return count[rem - 1];
int Min = INT_MAX;
for (int coin : coins) {
int res = dp(coins, rem - coin);
if (res >= 0 && res < Min) {
Min = res + 1;
}
}
count[rem - 1] = Min == INT_MAX ? -1 : Min;
return count[rem - 1];
}
public:
int coinChange(vector<int>& coins, int amount) {
if (amount < 1) return 0;
count.resize(amount);
return dp(coins, amount);
}
};

int main()
{
Solution t;
vector<int> v={ 2,5,50,100 }; //就是这组数据,删掉2,5或者把需要凑得钱数调小些的画就不会有问题。
cout << t.coinChange(v, 15646) << endl;
}


跑起来之后count数组会抛出栈溢出的异常,是递归层数太多的原因么?
...全文
154 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin5161678 2020-03-09
  • 打赏
  • 举报
回复
用最少的硬币 并且最小币值是1
不用递归 不用动态规划
简单的贪心而已
计算多少种组合之类的问题才需要考虑动态规划
Michael阿明 2020-03-09
  • 打赏
  • 举报
回复
应该用动态规划来做!
yakeMili 2020-03-09
  • 打赏
  • 举报
回复
引用 3 楼 lin5161678 的回复:
用最少的硬币 并且最小币值是1 不用递归 不用动态规划 简单的贪心而已 计算多少种组合之类的问题才需要考虑动态规划
硬币种类与数量是不确定的,这种题能贪心?
lin5161678 2020-03-09
  • 打赏
  • 举报
回复
引用 4 楼 yakeMili 的回复:
[quote=引用 3 楼 lin5161678 的回复:] 用最少的硬币 并且最小币值是1 不用递归 不用动态规划 简单的贪心而已 计算多少种组合之类的问题才需要考虑动态规划
硬币种类与数量是不确定的,这种题能贪心?[/quote]看错了 没有保证 1 兜底 不能贪心 如果保证有无限1元兜底 随便贪心就可以了 没有的话 不行
寻开心 2020-03-09
  • 打赏
  • 举报
回复
用贪心啊
何谓贪心,就是优选最好的可能, 如果不行放弃它,选择次好的,依次类推


比如,5,2,1三种面额,凑98
优先把5的带上,如果有19个以上的5, 选19个, 剩下三的差距,先选2,再选1. 如果1面额数量是0
放弃一个5, 18个五, 剩下用2和1继续贪心出8这个值
还不行,就再放弃一个5, 类似这样的下去
GKatHere 2020-03-08
  • 打赏
  • 举报
回复
int res = dp(coins, rem - coin); 递归调用,深度太深,栈溢出。

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧