- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在研究一些算法,遇到了 coin change问题。
在思考这个问题时,我想到了这个朴素的递归解决方案:
int coinChange(const vector<int>& coins, int start, int n) {
if (n == 0) return 1;
if (n < 0) return 0;
int total = 0;
for (int i = start; i < coins.size(); ++i) {
if (coins[i] <= n) total += coinChange(coins, i, n-coins[i]);
}
return total;
}
然后我意识到“接受”的解决方案如下:
int count( int S[], int m, int n )
{
// If n is 0 then there is 1 solution (do not include any coin)
if (n == 0)
return 1;
// If n is less than 0 then no solution exists
if (n < 0)
return 0;
// If there are no coins and n is greater than 0, then no solution exist
if (m <=0 && n >= 1)
return 0;
// count is sum of solutions (i) including S[m-1] (ii) excluding S[m-1]
return count( S, m - 1, n ) + count( S, m, n-S[m-1] );
}
起初我以为两者本质上是一样的。我很清楚我的递归树要宽得多,但这似乎只是因为我的算法在每一层做了更多的工作,所以它变得平衡了。看起来这两种算法都在考虑用当前硬币进行更改的方法数量(假设它 <= 当前总和),并考虑在没有当前硬币的情况下进行更改的方法数量(因此所有元素都在硬币数组减去当前硬币)。因此,我的算法中的参数 start
与第二个算法中的 m
所做的基本相同。
虽然我看得越多,似乎不管前面的文字如何,我的算法都是 O(n^n)
而第二个是 O(2^n)
。我已经关注这个太久了,但如果有人能解释我的算法与第二个算法相比做了哪些额外的工作,那就太好了。
我理解这个问题的动态规划解决方案,这个问题纯粹是一个基于复杂性的问题。
最佳答案
这两段代码是相同的,只是第二段代码使用递归而不是 for 循环来迭代硬币。这使得它们的运行时复杂度相同(尽管由于额外的递归调用,第二段代码可能具有更差的内存复杂度,但这可能会在清洗过程中丢失)。
例如,这是在 S = [1, 5, 10] 且 m=3 的情况下对第二个 count
的部分评估。在每一行中,我扩展了最左边的 count
定义。
count(S, 3, 100)
= count(S, 2, 100) + count(S, 3, 90)
= count(S, 1, 100) + count(S, 2, 95) + count(S, 3, 90)
= count(S, 0, 100) + count(S, 1, 99) + count(S, 2, 95) + count(S, 3, 90)
= 0 + count(S, 1, 99) + count(S, 2, 95) + count(S, 3, 90)
您可以看到,这与求和 total
的 for 循环的计算相同。
这两种算法都很糟糕,因为它们以指数时间运行。这是一个(我的)答案,它使用一种简洁的动态编程方法,该方法在 O(nm) 时间内运行并使用 O(n) 内存,并且非常简洁——在大小上与您的天真递归解决方案相当。 https://stackoverflow.com/a/20743780/1400793 .它是用 Python 编写的,但可以轻松转换为 C++。
关于c++ - 递归算法时间复杂度 : Coin Change,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38427665/
在以下情况下,如何确定函数返回 0 或 1 的概率: Let the function_A return 0 with probability 40% and 1 with probability 6
我是 prolog 的新手,正在尝试解决这个经典的硬币找零问题。 用公式 M>=0 和 M = P+5*N+10*D 改变(M,P,N,D)这是我的方法 change(M,P,N,D) :-
我目前正在使用 COIN OR BCP 框架研究分支和价格 (BAP) 算法。这是一个不错的框架,但有点旧,而且文档也不好。我希望这里有人能够回答我的问题。 我的 BAP 算法运行良好,但我注意到,我
题目地址:https://leetcode.com/problems/coin-change/description/ 题目描述 Youare given coins of different d
题目地址:https://leetcode.com/problems/arranging-coins/#/descriptionopen in new window 题目描述 Youhave a
为什么我的代码没有打印名为 coins 的 int ?运行调试系统时我没有看到任何错误。 #include #include int main(void) { // getting the us
我正在尝试设置 Coin-CLP按照网站上的说明还支持 CPLEX(我已经安装并在我的机器上顺利运行)。 不幸的是,当我尝试在安装时运行配置步骤时,在我想要包含 CPLEX 的版本中看起来像这样: .
所以我正在做硬币系统,但我遇到了一个小问题。通常,每当我输入某些内容时,我都会得到 1 个硬币,但当我使用 !coins 命令检查我有多少硬币时,我不希望机器人给我硬币。我希望它在使用此命令时忽略给我
我在使用 Javascript Coin Slider 时遇到问题(非常棒,下载地址:this workshop)。我附上 2 个屏幕截图。一个是在 chrome 中工作的文件,第二个是同时托管在我的
我有一个输入: 测试用例数量 一笔钱 作为我需要的输出: 我们拥有的不同硬币的数量以及每枚硬币的值(value)。 程序应该确定是否有解决方案,因此输出应该是"is"或“否”。 我使用动态规划编写了程
所以这是我的代码,我试图找出从无限供应的硬币中组成我的目标数量的最小硬币数量。我的问题是我没有得到所需的硬币数量,而是得到了 0。那么我该如何解决这个问题呢?如果我不清楚的话,很抱歉。我的英语不太好:
尝试为一般硬币找零问题编写 DP 解决方案,同时跟踪使用了哪些硬币。到目前为止,我一直在努力为我提供所需的最少硬币数量,但无法弄清楚如何获得使用了哪些硬币以及使用了多少次。如果使用硬币,我尝试用值设置
http://uva.onlinejudge.org/external/6/674.html我正在努力解决这个问题。不过请注意,这不是最小硬币找零问题,它要求我使用 50、25、15、10、5 和 1
我正在研究一些算法,遇到了 coin change问题。 在思考这个问题时,我想到了这个朴素的递归解决方案: int coinChange(const vector& coins, int start
我遇到了 a nice post在@amalloy 上寻找 hylomorhism示例,通过有用的讨论和完整的实现来说明递归方案 (RS) 的用法: {-# LANGUAGE DeriveFuncto
当接受我正在制作的 NFT 的付款时,我如何确保我可以从我的模块调用 coin.transfer 和 coin.details? 最佳答案 所以唯一的必要条件是 代币合约引用 传输能力 您可以像普通函
我想在 ERC-20 网络上创建一个 token 。 我想继承我合约中的接口(interface)。 当我继承表单界面时,它向我显示此错误: Contract "CpayCoin" should be
/**************************************************** **********************************************
我最近开始解决 DP 问题,并遇到了 COINS。我尝试使用带有内存功能的 DP 来解决它,如果我使用 int 数组(我猜),它就可以正常工作。这是我的方法(剩下一些修改): #include #i
假设有一家公司拥有几个vending machines收集硬币的。当投币保险箱已满时,机器将无法出售任何新元素。为了防止这种情况发生,公司必须在此之前收集硬币。但如果公司太早 dispatch 技术人
我是一名优秀的程序员,十分优秀!