在订阅的页面中看到该算法题。解决方案有人说穷举,有人说动态规划,其实这道题目没这么复杂。因为子序列必须是连续的。(不然就是背包问题了)。所以有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;
}