关于子阵列和的动态程序

时间:2016-03-10 16:11:40

标签: algorithm dynamic-programming

我发现有关动态程序的问题 像这样:

让我们说有一个像这样的数组:[600,500,300,220,210] 我想找到一个子数组,其总和最接近1000并且大于它。(> = 1000)。

我该如何编写代码?我已经理解了01背包问题,但仍然无法解决这个问题

3 个答案:

答案 0 :(得分:1)

一些事情:

首先,我认为你指的是"动态编程"而不是"动态程序&#34 ;;如果您想了解其中的差异,请在此处阅读:https://en.wikipedia.org/wiki/Dynamic_programming

其次,我认为你的意思是"最接近1000但不大于它(< 1000)",因为这是一般约束。如果你被允许超过1000,那么这个问题没有意义,因为没有约束。

与背包问题一样,这将是一个非多项式(NP)时间问题(计算所需时间比多项式增长更快 - 通常是指数或更快)的问题,您通常需要检查每种可能的数字组合,对于看似小的设定尺寸可能需要很长时间。

我相信你提供的5个正确答案是500 + 220 + 210,总计930,这是你可以在不超过1000的情况下制作的最大答案。

动态编程的基本思想是将问题分解为更容易计算的更小的类似问题;例如,如果您有一百万个数字并想要找到最接近100000但未结束的子集,您可以将百万分成10个元素的100,000个子集,并找到最接近每个子集的较小数量的子集,然后使用得到的100,000个总和来重复10,000套等,直到你把它减少到一个接近但不完美的解决方案。

在任何非多项式时间问题中,动态规划只能用于构建近似值,因为解决方案不能保证最优。

答案 1 :(得分:0)

您可以使用EmerCoin wallet中的交易优化工具。 它真的很棒,你正在寻找什么。

答案 2 :(得分:0)

解决此问题的方法可以分两步完成:

  • 定义一个函数,该函数采用子数组并为您提供此子数组的评估或分数,以便您可以实际比较子数组并获得最佳效果。功能可以简单地

    if(sum(subarray) < 1000) return INFINITY else return sum(subarray) - 1000

    请注意,您还可以使用动态编程来计算子数组的总和

  • 假设目标数组的长度为N,则需要解决大小为1到N的问题。如果数组的长度为1则显然有一种可能性而且它是最好的。如果size > 1那么我们采用长度为size - 1的问题的解决方案,并将它与包含数组的最后一个元素的每个子数组进行比较,并将最佳子数组作为问题的解决方案,使用length { {1}}。

我希望我的解释有意义