dynamic-programming - 使用动态规划查找总和最接近给定数字 M 的数字子集

标签 dynamic-programming knapsack-problem subset-sum

给定一个由 n 个正整数 a1, a2,... a3 和另一个正整数 M 组成的集合 A,我将找到 A 的一个子集,其总和最接近 M。换句话说,我我试图找到 A 的子集 A′,使得绝对值 |M - Σ a∈A′|最小化,其中 [ Σ a∈A′ a ] 是 A′ 的个数总和。我只需要返回解子集A′的元素之和,而不报告实际的子集A′。

例如,如果 A 为 {1, 4, 7, 12},M = 15,则解子集为 A′ = {4, 12},因此算法只需返回 4 + 12 = 16 作为答案。

问题的动态规划算法应该运行在 最坏情况下的时间为 O(nK),其中 K 是 A 的所有数字之和。

最佳答案

您构造一个大小为 n*K 的动态规划表,其中

D[i][j] = 你能使用前 i 个元素求和 j 吗?

您可以使用的递归关系是:D[i][j] = D[i-1][j-a[i]] OR D[i-1][j] 这个关系如果认为第i个元素可以添加或留下,则可以导出。

时间复杂度:O(nK),其中 K=所有元素的总和

最后,迭代可以获得的全部可能总和,即 D[n][j],j=1..K。最接近 M 的就是您的答案。

关于dynamic-programming - 使用动态规划查找总和最接近给定数字 M 的数字子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33717186/

相关文章:

algorithm - 总和小于 N 的最少子集

arrays - 仅使用 3 个元素形成数组的方法有多少?

c++ - 统计数字和等于 x*m 的数字和的数字 x 的个数

algorithm - 给出大于或等于给定数字的最小总和的子集

c++ - 在我的背包实现中遇到问题(PARTY)

寻找子集组合以实现给定总和同时保持成本最低的算法

algorithm - 在大于给定数字的数字列表中找到最佳元素总和

java - 如何使用以下约束调整我的 0-1 背包代码 [JAVA]

javascript - 带重复的背包 - 阵列解决方案

javascript - 允许重复使用号码的子集和