题目如下(原题不是这样,我自己浓缩了下/捂脸,原题目太绕了)
/**
* 先输入一个数,表示和,再输入一个数,表示数据的项数,然后输入上一个数字那么多个的数字
* 所要做的事情,在输入的数字中挑选若干个数字,这些数字的和凑成第一个数字,然后打印出每次未用到的数字
* @author Administrator
*
*/
解题源代码如下:
import java.util.Scanner; /** * 先输入一个数,表示和,再输入一个数,表示数据的项数,然后输入上一个数字那么多个的数字 * 所要做的事情,在输入的数字中挑选若干个数字,这些数字的和凑成第一个数字,然后打印出每次未用到的数字 * @author Administrator * */ public class Demo08 { public static void f(int err_sum,int[] a,int ini,int cur_sum,boolean[] flag) { if(cur_sum>err_sum)return; if(cur_sum==err_sum) { for(int i = 0;i<a.length;i++) { if(!flag[i]) { System.out.print(a[i]+" "); } } System.out.println(); return; } if(ini>=a.length)return; flag[ini] = false;//初始化 f(err_sum,a,ini+1,cur_sum,flag); flag[ini] = true; cur_sum+= a[ini]; f(err_sum,a,ini+1,cur_sum,flag); flag[ini] = false;//回溯 } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int err_sum = sc.nextInt(); // int err_sum = 6; int size = sc.nextInt(); // int a[] = {3,2,1,3,4}; int a[] = new int[size]; for(int i = 0;i<size;i++) { a[i] = sc.nextInt(); } boolean[] flag = new boolean[a.length]; f(err_sum,a,0,0,flag); } }
解题思路:
这里说一个小技巧吧,就是递归算法在很难解决的时候,可以考虑一下增加传入参数,可能问题就迎刃而解了
本题解决方法的主要思想就是:游标先定位在最后一个,然后一个一个往前移动,每移一次就把后面的数字在遍历一遍,如果有符合条件的,就打印出来
如果超出了接线的,就return就好
希望对大家有所帮助
以上