和等于total的解答

(原题From http://community.csdn.net/Expert/topic/3971/3971377.xml?temp=.7857324)

1.从已知数组d的前n个元素中找出部分元素序列之和等于total的元素序列,约定数组的元素都是正整数,且都小于等于total。

以下是我的解答:

这个题可以用递归进行穷举。

假设

实现以上方法的函数为 int GetTotal(int *a_piArr,int a_in,int m_iTotal,int i_iIndex)。

其中

函数返回值为能够得到的个数,

const int*const a_piArr为数组的首地址,

const int a_in为从前n个元素中找,

const int m_iTotal为需要找的和,

int a_iNowTotal 为目前的和,

int a_iIndex 为目前的第index个数值,

int *const a_iTmpArr存放找到的几个数值的index,

int a_iTmpCnt存放目前的a_iTmpArr中存放的元素个数。

int GetTotal(const int* const a_piArr,const int a_in,const int a_iTotal,int a_iNowTotal,int a_iIndex,int * const a_iTmpArr,int a_iTmpCnt)

{

static int iRet = 0;

int i;

if(a_iIndex >= a_in || a_iNowTotal > a_iTotal)

{

return iRet;

}

while(a_iIndex < a_in)

{

while((a_iIndex < a_in) && (a_iNowTotal + a_piArr[a_iIndex] > a_iTotal))

{

a_iIndex ++;

}

if(a_iIndex >= a_in)

{

return iRet;

}

if(a_iNowTotal + a_piArr[a_iIndex] < a_iTotal)

{

a_iTmpArr[a_iTmpCnt] = a_iIndex;

GetTotal(a_piArr,a_in,a_iTotal,a_iNowTotal + a_piArr[a_iIndex],a_iIndex + 1,a_iTmpArr,a_iTmpCnt + 1);

}else // =

{

a_iTmpArr[a_iTmpCnt] = a_iIndex;

for(i = 0; i <= a_iTmpCnt; i ++)

{

cout<<a_iTmpArr[i] <<":"<< a_piArr[a_iTmpArr[i]] <<" " ;

}

cout << endl;

}

a_iIndex ++;

} // end while(a_iIndex < a_in)

return iRet;

}

例如:

main()中运行如下语句:

int iTmp[n];

int id[] = {2,5,5,2,5,6,3};

int iTotal = 12;

int iRet;

iRet = GetTotal(id,n,iTotal,0,0,iTmp,0);

即会将数组id[]的前5个数中和等于12的几个值的序号和值打印出来。

(完毕)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值