在订阅的页面中看到该算法题。解决方案有人说穷举,有人说动态规划,其实这道题目没这么复杂。因为子序列必须是连续的。(不然就是背包问题了)。所以有O(N平方)的解法,而不是O(2的N次方)
代码如下:
#include <iostream>
using namespace std;
// 本函数只打印唯一解,如果要打印所有解,就先扫描最大值,再扫描一次打印所有即可
int printMaxSeqence(int* a, int size, int limit)
{
int max_seq_first = -1;
int max_seq_last = -1;
int max_seq_sum = 0;
for (int i = 0; i < size; ++ i)
{
int sum = 0;
for (int j = i; j >= 0; -- j)
{
sum += a[j];
if (sum > limit)
{
break;
}
else if (sum == limit)
{
for (int k = j; k <= i; ++ k)
{
cout << a[k] << ",";
}
cout << endl;
return sum;
}
else
{
if (sum > max_seq_sum)
{
max_seq_sum = sum;
max_seq_first = j;
max_seq_last = i;
}
}
}
}
for (int i = max_seq_first; i <= max_seq_last; ++ i)
{
cout << a[i] << ",";
}
cout << endl;
return max_seq_sum;
}
int main()
{
int a[] = {5, 8, 1, 4, 3, 9};
cout << printMaxSeqence(a, 6, 11) << endl;
return 0;
}