一、题目
N个红包排成一排,各个红包的大小清楚可见,假定你已通过某种方式获取取得k个红包的权力,通常的情况下使用贪心算法每次取最大的红包即可,但规定,只能够从两端取。请编写函数,计算从含有N个红包的红包序列的两端取出k个红包的最大总和值(1<=k<=N)。
函数接口定义:
int fun(int *d,int N,int k);
输入样例:
第一行两个整数:红包数量N和可取数量k。
第二行是空格分隔的N个红包大小。
8 3
21 2 50 500 40 20 300 2
输出样例:
计算并返回从两端取k个红包的最大总和。
323
二、思路
一列数据,只能从两端抽取k次,要求抽取数之和不能大于指定数,且返回最大抽取数之和。从结果来看,会在这列数据的左边抽取i个,从这列数据的k-i个。只要循环k次,找到最大抽取数之和即可。
三、代码
int fun(int *d,int N,int k){
int c,sum=0;
for(int i=0;i<=k;i++){
c=0;
for(int j=0;j<k-i;j++) //左边抽取
c+=d[j];
for(int j=0;j<i;j++) //右边抽取
c+=d[N-1-j];
if(sum<c) //找到最大总数
sum=c;
}
return sum;
}