题目:
给定一个有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<&