一道算法题求教

发布于 2022-09-01 05:23:13 字数 75 浏览 15 评论 0

在效率尽可能高的情况下解答:
在给定一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在有任意个其和等于x的元素?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

时光病人 2022-09-08 05:23:13

通过维基百科和stackoverflow 知道这是subset problem

采用动态规划进行求解:
1. 设集合x的最小和以及最大和分别是min,max,设一个二维数组 m[n][max-min]
m[i][s] = 1表示找到了x[1...i]的一个子集和等于s

因此初试条件:m[1][x1] = 1
递推关系:
m[2][x] = 1 if m[1][x-x2] = 1, 否则 m[2][x] = m[1][x]

朮生 2022-09-08 05:23:13

任意个其和?应该说有多少种方案吧!典型组合数学,去翻翻书就知道了.

滴情不沾 2022-09-08 05:23:13

这个题目是01背包的变种吧,楼主可以先去学习下01背包。事实上我们可以这么做我们设布尔变量fi为1~i个数中是否存在和为x的任意元素,那么我们可以得到递推表达式f[i][j] = (f[i - 1][j - arr[i]] | f[i - 1][j]);其中f[i - 1][j - arr[i]]意思是选这个元素可不可能实现。f[i - 1][j]的意思就是不选这个元素可不可以实现。所以最后我们可以得到这样的一个程序:

#include <iostream>

int n, x, arr[100];
bool f[100][100000];

int main(int argc, char const *argv[]) {
    scanf("%d %d", &n, &x);
    f[0][0] = true;
    for (int i = 1; i <= n; ++i)
        f[i][0] = true;
    for (int i = 1; i <= n; ++i) 
        scanf("%d", &arr[i]);

    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= x; ++j) {
            if (j >= arr[i]) 
                f[i][j] = (f[i - 1][j - arr[i]] | f[i - 1][j]);
            else f[i][j] = f[i - 1][j]; //如果当前当前元素比x大那么我们不选结果就是不选的那个
        }
    }

    if (f[n][x]) printf("YES\n");
    else printf("NO\n");

    return 0;
}

最后时间复杂度 O(n * x)
当然如果你看懂上面的步骤的话那么你还可以对空间复杂度进行优化,优化原理如果感兴趣可以私信我或自己研究。
代码如下:

#include <iostream>

int n, x, arr[100];
bool f[100000];

int main(int argc, char const *argv[]) {
    scanf("%d %d", &n, &x);
    f[0] = true;
    for (int i = 1; i <= n; ++i) 
        scanf("%d", &arr[i]);

    for (int i = 1; i <= n; ++i) {
        for (int j = x; j >= 1; --j) {
            if (j >= arr[i]) 
                f[j] = (f[j - arr[i]] | f[j]);
            else f[j] = f[j];
        }
    }

    if (f[x]) printf("YES\n");
    else printf("NO\n");

    return 0;
}

这样空间复杂度就变为了 O(x)。
以上。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文