给定n个非负整数,图中i表示序号,ai为数值,由数值水平线构成容器中最多的水。
如图所示,最多可以装7+6+2+5+4+7+7=48
算法思想:设一个max存储最大容量,初试置0,取较大值作为边界,从后向前遍历,每次从取左右端点,然后从左从右遍历,总数累加,如果超过边界则以边界作为数值加入总量,每次遍历完,比较最大总量作为结果暂存,左边界后移,遍历结束返回最大值。
int MaxCapacity(ElemType A[] ,int n){
int left = 0, right , temp ,sum , max = 0; //设左、右边界,初值、总和、最大总和
//左边界不动,右边界不断向前遍历移动
for(int j = n-1; j>0; j--){
right = j; sum = 0; //每一次总和清空
temp = (A[left]>A[right]?A[left]:A[right]; //取左右边界最大者为参考数值
for(int i = left+1;i<right;i++) //从左边界开始向右累加数值
if(temp<A[i]) //中间每个元素比边界值大,则最多装入边界值的数据
sum += temp;
else //在边界值一下则将该位置的数值加入
sum += A[i];
if(sum>max){ //当前总和与暂存的最大总和比较
max = sum;
left++:
}
}
return max;
}