内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java
题目描述
输入两个整数n和sum,从数列1,2,3.......n 中随意取几个数,使其和等于sum,要求将其中所有的可能组合列出来。
分析与解法
解法一
注意到取n,和不取n个区别即可,考虑是否取第n个数的策略,可以转化为一个只和前n-1个数相关的问题。
- 如果取第n个数,那么问题就转化为“取前n-1个数使得它们的和为sum-n”,对应的代码语句就是sumOfkNumber(sum - n, n - 1);
- 如果不取第n个数,那么问题就转化为“取前n-1个数使得他们的和为sum”,对应的代码语句为sumOfkNumber(sum, n - 1)。
参考代码如下:
/* * 寻找和为定值的多个数 */ public class SearchSomeSureValue { static int length; static void findResult(int n,int m,int flag[]){ if (n<=0||m<=0) { return; } if (n>m) { n=m; } if (n==m) { flag[n-1]=1; for (int i = 0; i < length; i++) { if (flag[i]==1) { System.out.print(i+1+" "); } } System.out.println(); flag[n-1]=0; } flag[n-1]=1; findResult(n-1, m-n, flag); flag[n-1]=0; findResult(n-1, m, flag); } public static void main(String[] args) { int n=5,m=5; length=n; int[] flag=new int[n]; findResult(n, m, flag); } }