dfs_部分和问题

给定整数a1,a2,....,an ,选若干数时它们的和为k。

解析:每个数有两种状态:加、不加。 全部n个数都决定其状态后进行判断。复杂度O(2n)

生成可行解空间多用dfs实现。

 

import java.util.Scanner;

public class Main {
    static int n,k;
    static int[] a;
    
    static boolean dfs(int i,int sum){
        //前n项都计算过了,则返回sum是否与k相等
        if(i == n) return sum == k;        
        //不加a[i]
        if(dfs(i+1,sum)) return true;
        //加a[i]
        if(dfs(i+1,sum+a[i])) return true;        
        return false;    
    }
    

    public static void main(String[] args) {
        
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        a = new int[n];
        for(int i = 0; i < n; i++){
            a[i] = in.nextInt();
        }
        k = in.nextInt();
        if(dfs(0,0)) System.out.println("YES");
        else System.out.println("NO");

    }

}

 

posted @ 2017-03-31 11:38  Gladitor  阅读(152)  评论(0编辑  收藏  举报