Java 部分和问题 dfs

部分和问题用深度优先来解答


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

输入

首先,n和k,n表示数的个数,k表示数的和。
接着一行n个数。
(1<=n<=20,保证不超int范围)

输出

如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO”

输入样例

4 
1 2 4 7
13

输出样例

YES 13 = 2 + 4 + 7
大体的思路是,每个数组中的数字都有两种选择方式,选择与不选择,一次递归就可以了。

放代码

import java.util.*;

/**
 * @Author Robin Wang
 * @Date 2020/3/9 13:15
 */
public class 部分和 {
    static int k;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        List<Integer> list = new ArrayList<>();
        int n = sc.nextInt();
        int a[] = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
        k = sc.nextInt();
        dfs(a, k, 0, list);

    }

    private static void dfs(int[] a, int e, int i, List<Integer> lis) {
        int w = i;
        if (e == 0) {
            System.out.print("YES" + " "+k + " =" + " ");
            for (int j = 0; j < lis.size(); j++) {
                System.out.print(lis.get(j) + (j == lis.size() - 1 ? "" : " + "));
            }
            System.out.println();
            System.exit(0);
        }
        if (e < 0 || i == a.length) {
            return;
        }


        dfs(a, e, i + 1, lis);
        lis.add(a[i]);
        int index = lis.size() - 1;
        dfs(a, e - a[i], i + 1, lis);
        lis.remove(index);


    }

}

原创文章 9 获赞 8 访问量 661

猜你喜欢

转载自blog.csdn.net/qq_43625843/article/details/104756515
今日推荐