作业帮 > 综合 > 作业

跪求C语言数据结构程序设计

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/03 05:11:36
跪求C语言数据结构程序设计
有一集合中有 N 个元素,每个元素均为自然数.给定一个 total (假设每个 元素值均小于total),求满足条件的所有子集,子集中各元素之和应等于total
最好描述下程序功能内容与重点难点,要做报告和答辩
/*
 *程序功能:有一集合中有 N 个元素,每个元素均为自然数.给定一个 total (假设每个 元素值均小于total),求满足条件的所有子集,子集中各元素之和应等于total
 */
#include <stdio.h>
#define N 5//定义集合中元素的个数
#define TOTAL 10//定义子集元素之和total
int main(int argc, char** argv)
{
    int i = 0;//循环变量
    int j = 0;//循环变量
    int sum = 0;//定义各子集元素之和
    long int loop = 1;//定义总循环数
    int index = 0;//定义子集索引
    int array[N] = {0};//定义集合array
    int tmp[N] = {0};//定义子集tmp
    for(i=0; i<N; i++)//循环输入集合中的元素
    {
        printf("Please input array[%d]:", i);
        scanf("%d", &array[i]);
        loop = loop * 2;//总循环数*2
    }
    for(i=0; i<loop; i++)//主循环,假设i=5,则其二进制表示为00101,当有一位为1时,该位位置就是集合中的索引,即对应着源集合中的array[2]和array[4]
    {
        sum = 0;
        index = 0;
        for(j=0; j<N; j++)//清空子集,准备存储下一个子集
        {
            tmp[j] = 0;
        }
        for(j=0; j<N; j++)
        {
            switch((i>>j) & 1)//循环右移,与1相与,取出第j位
            {
                case 1://取出i的第j位为1的索引
                        tmp[index] = array[N-j-1];//将i的第j位为1所代表的源集合中的元素放入子集中
                        sum = sum + array[N-j-1];//将i的第j位为1所代表的源集合中的元素累加
                        index ++;
                        break;
                default:
                    break;
            }
        }
        if(sum == TOTAL)//当子集元素之和等于TOTAL时,打印子集元素
        {
            for(j=0; j<N && tmp[j]!=0; j++)
            {
                printf(" +%d",tmp[j]);
            }
            printf("=%d\n",TOTAL);
        }
    }
    return 0;

再问: ����ʵ���������뼯��Ԫ�ظ���Ȼ����������Ӽ������õݹ�ɷ