给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数

这篇博客探讨了一道数学问题:给定一个包含n个正整数的数组A和一个整数sum,如何计算数组中部分数字相加等于sum的不同组合数。通过分析,提出从选择1到n个数的方案总数,利用递归方法确定每个数的位置来求解。博主分享了一个递归解决方案,并邀请读者讨论更优解。
摘要由CSDN通过智能技术生成

题目:

给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。

当两种选取方案有一个数字的下标不一样,就认为是不同的组成方案。

分析:

首先确定选择的个数,有n种这样的选择,分别是选择1个数,2个数...n个数。分别对应m1个选择方案,m2个选择方案...mn个选择方案。

所以,我们先写这样一个方法,计算m1+m2+...+mn,和就是我们求的总的方案数。

该方法需要两个参数,也就是两个初始条件,一个是数组A,一个是和sum.

	public static int getAllSchemeNum(int[] arr,int sum)
	{
		int count=0;
		//将选择一个数,两个数...n个数时的方案数相加
		for(int num=1;num<=arr.length;num++)
		{
			//getNumIfChosseM是选择m个数时得到的方案数
			count+=getSchemeNumIfChooseM(arr,num,0,sum);
		}
		return count;
	}

现在,重点是如何编写getSchemeNumIfChooseM方法。

如果我们选择k个数,并规定这些数的顺序与数组中的顺序相同,那么只要确定每个数的位置就ok了,我们先确定第一个数的下标,范围是[0,n-k],为什么可选下标的右边界是n-k,因为如果第一个数的下标是n-k+1,那么后面只有k-2个位置,放不下剩余的k-1个值。

假定第一个数选择的下标为b1(b1<&

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值