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 }

 

posted @ 2015-05-07 20:19  杨永华  阅读(158)  评论(0编辑  收藏  举报