给定一个整型数组,数组中的数组元素可能为正也可能为负值,求出该数组中元素连续相加的最大值。也就是求出和值最大的子数列。
比如给定一个数组 a【8】 = {1,-2,-5,3,8,-7,9,4},这个很显然,
最大的和值为a【3】+a【4】+a【5】+a【6】+a【7】 = 3+8+ -7+9+4=17 的值。
我想了最笨的方法:
就是把每个连续的子序列组合找出来,然后求出和值,然后挑出最大的就可以了。
我们可以用下图演示一下:
下面是一段简单测试代码:
#include<stdio.h>
int findSub(int a[],int size);
void PRINT(int a[],int size);
int main()
{
int a[8]={1,-2,-5,3,8,-7,9,4};
PRINT(a,8);
int Max = findSub(a,8);
printf("MaxSub: %d\n",Max);
return 0;
}
void PRINT( int a[],int size)//数组打印
{
int i;
for(i=0;i<size;i++)
{
printf("%d / ",a[i]);
}
printf("\n");
}
int findSub(int a[],int size)
{
int i,j,max;
int sum ;
max = a[0];//初始假设max 是a【0】的值
for(i=0;i<size;i++)//从第一个开始*,**和后面的每一个组合为一个子序列***
{
sum = a[i];//初始和值sum为a【i】;
for(j=i+1;j<size;j++)//**i 以后的每一个**
{
sum += a[j];//和值累加
if(max < sum)//如果假设的max 小于 所求的 sum的值
max = sum;//max更改为 sum的值
printf("i=%d: j=%d: sum=%d: max=%d: \n",i,j,sum,max);//输出当前的i,j,sum,max
}
}
return max;//返回max值
}