C++ 总和最多为“k”的子序列

C++ 总和最多为“k”的子序列,c++,arrays,algorithm,dynamic-programming,C++,Arrays,Algorithm,Dynamic Programming,给定一个大小为n的非递减数组a和一个整数k,如何找到数组a的子序列S,其元素的最大可能和,使该和最多为k。如果有多个这样的子序列,我们只想找到一个 例如,让数组为{1,2,2,4},n=4,k=7。那么,答案应该是{1,2,4} 蛮力法大约需要2^n-1,但有更有效的解决方案吗?在一般情况下,答案是否定的 只要确定是否存在一个元素总和为k的解就相当于,因此已经是NP完全的 子集和问题可以等价地表示为:给定整数或 自然数w_1,其中任何一个子集的和都精确地等于w吗 然而,如果n或表示最大数w所需的

给定一个大小为n的非递减数组a和一个整数k,如何找到数组a的子序列S,其元素的最大可能和,使该和最多为k。如果有多个这样的子序列,我们只想找到一个

例如,让数组为{1,2,2,4},n=4,k=7。那么,答案应该是{1,2,4}


蛮力法大约需要2^n-1,但有更有效的解决方案吗?

在一般情况下,答案是否定的

只要确定是否存在一个元素总和为k的解就相当于,因此已经是NP完全的

子集和问题可以等价地表示为:给定整数或 自然数w_1,其中任何一个子集的和都精确地等于w吗


然而,如果n或表示最大数w所需的比特数p较小,则可能存在更有效的解决方案,例如,如果p较小,则基于动态规划的伪多项式解决方案。此外,如果您的所有数字w都是正数,那么也可能找到更好的解决方案。

所有元素都是正数吗?可能是@Damien的重复。是的,元素大于零。@Saibot提供的Wiipedia链接提供了一个简单的动态编程算法示例。在第一步中,您可以尝试实现它,并检查它是否足够快。好的,谢谢,谢谢,如果所有的数字都大于零,那么什么是可能的动态规划解决方案?@S13 k而不知道细节:在上面的Wiki页面上,提到Pisinger发现了一个On*C算法,其中C是权重的上限,用于检查是否存在一个加起来等于k的权重组合。使用此方法检查从k到0的所有数字将得到*C*k。