| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 462 人关注过本帖
标题:请教一道题 望大家帮忙
只看楼主 加入收藏
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
 问题点数:0 回复次数:4 
请教一道题 望大家帮忙
求 A=(1,3,5,7,9)的所有子集  
2008-09-11 09:39
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
全子集题目,其实每个元素只有两个状态:选与不选。

你可以用回溯来写这个程序。

[[it] 本帖最后由 StarWing83 于 2008-9-11 10:23 编辑 [/it]]

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-11 10:21
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
这个是递归回溯的方法:
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 100

int s[N], a[N], n;

void comb(int t)
{
    if (t == n)
    {
        int i;
        for (i = 0; i < n; i++)
            if (s[i])
                printf("%d ", a[i]);
    }
    else
    {
        s[t] = 1;
        comb(t + 1);
        s[t] = 0;
        comb(t + 1);
    }
}

int main(void)
{
    while (scanf("%d", &n) == 1)
    {
        int i;
        for (i = 0; i < n; i++)
            scanf("%d", &a[i]);
        memset(s, 0, n);
        comb(0);
    }
    return 0;
}



非递归迭代调了半天……郁闷……
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 100

int s[N], a[N], n;

void comb()
{
    int i, k = 0;
    while (k >= 0)
    {
        if (k == n)
        {
            for (i = 0; i < n; i++)
                if (s[i])printf("%d ", a[i]);
            printf("\n");
            s[--k]++;
        }
        else if (s[k] >= 2)
            s[k] = 0, s[--k]++;
        else k++;
    }
}

int main(void)
{
    while (scanf("%d", &n) == 1)
    {
        int i;
        for (i = 0; i < n; i++)
            scanf("%d", &a[i]);
        memset(s, 0, n);
        comb(0);
    }
    return 0;
}




[[it] 本帖最后由 StarWing83 于 2008-9-11 11:14 编辑 [/it]]

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-11 10:38
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
谢谢你
真不好意思  我要了你的代码
我要的就是这个非递归的状态树

[[it] 本帖最后由 liyanhong 于 2008-9-11 11:36 编辑 [/it]]

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-09-11 11:34
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
其实还有更简单的:
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 100

int s[N], a[N], n;

void comb()
{
    int i, k = 0;
    while (k < n)
    {
        for (i = 0; i < n; i++)
            if (s[i])printf("%d ", a[i]);
        printf("\n");
        for (s[k=0]++; s[k] >= 2; s[k]++)
            s[k++]=0;
    }
}

int main(void)
{
    while (scanf("%d", &n) == 1)
    {
        int i;
        for (i = 0; i < n; i++)
            scanf("%d", &a[i]);
        memset(s, 0, n);
        comb(0);
    }
    return 0;
}

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-13 15:31
快速回复:请教一道题 望大家帮忙
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016585 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved