DFS-部分和

题目描述

给定整数序列a1,a2,…,an,判断是否可以从中选出若干数,使它们的和恰好为k.

1≤n≤20

-10^8≤ai≤10^8

-10^8≤k≤10^8

样例:输入

n=4
a={1,2,4,7}
k=13

输出:

Yes (13 = 2 + 4 + 7)

解法一

import javafx.scene.transform.Scale;

import java.util.ArrayList;
import java.util.Scanner;

public class dfs_部分和 {
    static void dfs(int []a, int k, int cur, ArrayList<Integer> ints){
        if (k==0){
            System.out.println("YES");
            System.exit(0);
        }
        if (cur==a.length||k<0){
            return;
        }

        dfs(a,k,cur+1,ints);
        ints.add(a[cur]);
        int index=ints.size()-1;
        dfs(a,k-a[cur],cur+1,ints);
        ints.remove(index);
    }
    public static void main(String[] args) {

        Scanner sc =new Scanner(System.in);
        int n=sc.nextInt();
        int[] a=new int[n];
        for (int i = 0; i <n ; i++) {
            a[i]=sc.nextInt();
        }
        int k=sc.nextInt();
        dfs(a,0,k,new ArrayList<Integer>());
    }
}

最优解法

import javafx.scene.transform.Scale;

import java.util.ArrayList;
import java.util.Scanner;

public class dfs_部分和 {
    static void dfs(int []a, int k, int cur, ArrayList<Integer> ints){
        if (k==0){
            System.out.println("YES");
            System.exit(0);
        }
        if (cur==a.length||k<0){
            return;
        }

        dfs(a,k,cur+1,ints);
        ints.add(a[cur]);
        int index=ints.size()-1;
        dfs(a,k-a[cur],cur+1,ints);
        ints.remove(index);
    }
    public static void main(String[] args) {

        Scanner sc =new Scanner(System.in);
        int n=sc.nextInt();
        int[] a=new int[n];
        for (int i = 0; i <n ; i++) {
            a[i]=sc.nextInt();
        }
        int k=sc.nextInt();
        dfs(a,0,k,new ArrayList<Integer>());
    }
}

转载:https://www.cnblogs.com/xiaoyh/p/10346658.html

你可能感兴趣的:(#,DFS)