poj 1564
题意:输出一组数中某几个数之和等于给定的值的所有情况,按降序排列
dfs 加简单的剪枝
题目做的少,递归方程仍然头疼
Memory: 3128K
Time: 297MS
1 import java.util.Scanner; 2 3 public class Main{ 4 static int n,m,flag; 5 static int nums[]; 6 static int path[]; 7 8 public static void dfs(int index,int step,int sum){ //index:正在递归的数的下标,step递归的数字个数,sum当前递归的数字和 9 if(sum == n){ 10 flag = 1; 11 12 for(int i=0;i<step-1;i++){ 13 System.out.print(path[i]+"+"); 14 } 15 System.out.println(path[step-1]); 16 return; 17 } 18 19 int pre = -1; //记录将要递归的数的前驱,若两个数相同则跳过 20 for(int i=index;i<m;i++){ 21 if(sum+nums[i]<=n&&nums[i]!=pre){ 22 pre = nums[i]; 23 path[step] = nums[i]; 24 dfs(i+1,step+1,sum+nums[i]); 25 } 26 } 27 return; 28 } 29 30 public static void main(String[] args){ 31 Scanner in = new Scanner(System.in); 32 while(in.hasNext()){ 33 n = in.nextInt(); 34 m = in.nextInt(); 35 if(n==0&&m==0) 36 break; 37 nums = new int[m]; 38 path = new int[m]; 39 for(int i=0;i<m;i++){ 40 nums[i] = in.nextInt(); 41 } 42 flag = 0; 43 System.out.println("Sums of "+n+":"); 44 dfs(0,0,0); 45 if(flag==0){ 46 System.out.println("NONE"); 47 } 48 } 49 } 50 }