dfs:部分和问题

*/-->

pre.src {background-color: Black; color: White;}

pre.src {background-color: Black; color: White;}

pre.src {background-color: Black; color: White;}

pre.src {background-color: Black; color: White;}

pre.src {background-color: Black; color: White;}

dfs:部分和问题

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

注意:

每个数只能选择一次,当然也可以不选
// CreateTime: 2015-04-07 22:55:39

#include <iostream>

using namespace std;

int n;
int a[100005];
int k;
int ok;

void dfs(int step, int sum) {
    if (n == step) {
        if (sum == k) {
            ok = 1;
        }
        return;
    }
    dfs(step+1, sum);
    dfs(step+1, sum+a[step]);
}

int main(void) {
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    cin >> k;

    ok = 0;
    dfs(0, 0);

    if (ok) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }

    return 0;
}
// 4 1 2 4 7 13
// 4 1 2 4 7 15

还可以写的更美观点

// CreateTime: 2015-04-07 22:55:39

#include <iostream>

using namespace std;

int n;
int a[100005];
int k;
int ok;

int dfs(int step, int sum) {
    if (n == step) {
        if (sum == k) {
            return 1;
        } else {
            return 0;
        }
    }
    if(dfs(step+1, sum)) {
        return 1;
    }
    if(dfs(step+1, sum+a[step])) {
        return 1;
    }
}

int main(void) {
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    cin >> k;

    ok = 0;
    if(dfs(0, 0)) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }

    return 0;
}
// 4 1 2 4 7 13
// 4 1 2 4 7 15
时间: 2024-08-09 12:27:29

dfs:部分和问题的相关文章

[SHOI2002]滑雪-题解报告

题目描述 Michael 喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael 想知道在一个区域中最长的滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子: 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度会减小.在上面的例子中,一条

nyist oj 1058 部分和问题 (DFS搜索)

部分和问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. 输入 首先,n和k,n表示数的个数,k表示数的和. 接着一行n个数. (1<=n<=20,保证不超int范围) 输出 如果和恰好可以为k,输出"YES",并按输入顺序依次输出是由哪几个数的和组成,否则"NO" 样例输入 4 13 1 2 4 7 样例输出 YES 2 4 7 来

NYOJ 1058 部分和问题(经典题目dfs)

部分和问题 描述 给定整数a1.a2.--.an,判断是否可以从中选出若干数,使它们的和恰好为K. 输入 首先,n和k,n表示数的个数,k表示数的和. 接着一行n个数. (1<=n<=20,保证不超int范围) 输出 如果和恰好可以为k,输出"YES",并按输入顺序依次输出是由哪几个数的和组成,否则"NO" 样例输入 4 13 1 2 4 7 样例输出 YES 2 4 7 题目分析: 这是一道经典的dfs问题,好多公司也用它做过面试题,我们定义函数dfs

NYOJ-1058 部分和问题【DFS】

部分和问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. 输入 首先,n和k,n表示数的个数,k表示数的和.接着一行n个数.(1<=n<=20,保证不超int范围) 输出 如果和恰好可以为k,输出"YES",并按输入顺序依次输出是由哪几个数的和组成,否则"NO" 样例输入 4 13 1 2 4 7 样例输出 YES 2 4 7 代码:

acdream 1726 A Math game (部分和问题 DFS剪枝)

A Math game Time Limit: 2000/1000MS (Java/Others) Memory Limit: 256000/128000KB (Java/Others) Problem Description Recently, Losanto find an interesting Math game. The rule is simple: Tell you a numberH, and you can choose some numbers from a set {a[1

NYOJ 1058 部分和问题 【DFS】

部分和问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. 输入 首先,n和k,n表示数的个数,k表示数的和. 接着一行n个数. (1<=n<=20,保证不超int范围) 输出 如果和恰好可以为k,输出"YES",并按输入顺序依次输出是由哪几个数的和组成,否则"NO" 样例输入 4 13 1 2 4 7 样例输出 YES 2 4 7 简

部分和问题(dfs)

部分和问题 时间限制:1000 ms  |           内存限制:65535 KB 难度:2 描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. 输入 首先,n和k,n表示数的个数,k表示数的和. 接着一行n个数. (1<=n<=20,保证不超int范围) 输出 如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO” 样例输入 4 13 1 2 4 7 样例输出 YES 2 4 7  题解:这题用动态规划应

nyoj 1058部分和问题(DFS)

部分和问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. 输入 首先,n和k,n表示数的个数,k表示数的和.接着一行n个数.(1<=n<=20,保证不超int范围) 输出 如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO” 样例输入 4 13 1 2 4 7 样例输出 YES 2 4 7 #include<cstdio>

部分和问题(南阳oj1058)(DFS)

部分和问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. 输入 首先,n和k,n表示数的个数,k表示数的和. 接着一行n个数. (1<=n<=20,保证不超int范围) 输出 如果和恰好可以为k,输出"YES",并按输入顺序依次输出是由哪几个数的和组成,否则"NO" 样例输入 4 13 1 2 4 7 样例输出 YES 2 4 7 简