【发布时间】:2016-07-28 05:01:54
【问题描述】:
给定一个长度为n 的数组,如果不允许选择数组的两个以上连续元素,则需要找到一个可以选择的最大元素总和。例如;
n=5;
arr[5] = {10,3,5,7,3};
Output : 23
10+3+7+3=23
所以我写了这段代码;
#include <stdio.h>
#include <stdlib.h>
int max=0;
void solve(int arr[],int ind,int sum,int n,int count)
{
if(ind==n){
if(sum>max)
max=sum;
}
else{
sum+=arr[ind];
if(ind==n-1)
solve(arr,ind+1,sum,n,1);
if(ind==n-2 && count>1)
solve(arr,ind+2,sum,n,1);
if(ind<n-1 && count<2){
count++;
solve(arr,ind+1,sum,n,count);
}
if(ind<n-2)
solve(arr,ind+2,sum,n,1);
if(ind<n-3)
solve(arr,ind+3,sum,n,1);
}
}
int main()
{
int n;
scanf("%d",&n);
int i=0,arr[n];
while(i<n){
scanf("%d",&arr[i]);
i++;
}
int count=1;
//going into all three possibilities
solve(arr,0,0,n,count);
solve(arr,1,0,n,count);
solve(arr,2,0,n,count);
printf("%d\n",max);
return 0;
}
此程序会为 n<1000 生成预期的输出,但会显示较大输入的运行时错误 (SIGSEGV)。可能是什么原因?
也欢迎更有效的解决方案.....
【问题讨论】:
-
可能是递归太深导致堆栈溢出?但是数量可能太少而不会引起呢?
-
请先尝试使用调试器确定 SIGSEGV 的原因。
-
给定
n<200000和arr[i]<10000....会不会造成溢出.. -
对于每个级别的递归,堆栈上大约有 30 个字节的信息。所以
n=33000将在堆栈上放置大约 1 兆字节。这可能足以溢出堆栈。 -
@user3386109 你能建议另一种解决这个问题的方法吗...
标签: c arrays algorithm recursion runtime-error