已知n个正数:wi, 1<=i<=n, 和M。要求找出{wi }的所有子集使得子集内元素之和等于M。例如: n=4, (w1,w2,w3,w4)=(11,13,24,7),M=31 则满足要求的子集是(11,13,7)和(24,7)。


#include<stdio.h>
int M,n,i;
int x[100];
int w[100];
void SumOfSub(int s, int k, int r)//s:当前和数  k:当前个数  r:总数和
    {
        x[k]=1;
        if(s+w[k]==M) //子集找到
        {
            printf("子集为:");
            for(i=1; i<=k; i++)
                if(x[i]==1) 
                    printf("%d ",w[i]);
            printf("\n");
        }else if(s+w[k]+w[k+1]<=M)
            SumOfSub(s+w[k], k+1, r-w[k]);
        
        if(s+r-w[k]>=M && s+w[k+1]<=M)
        {
            x[k]=0;
            SumOfSub(s, k+1, r-w[k]);
        }
    } 
    void main()
    {
        int r=0;
        int k=1;
        int s=0;
        printf("请输入n和子集内元素和M:");
        scanf("%d%d",&n,&M);
        printf("请输入各元素值:");
        for(i=1;i<=n;i++){
            scanf("%d",&w[i]);
            r+=w[i];
        }
        M=31;
        SumOfSub(s, k, r);
    }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



猜您在找 [总结]-2018 w1 输入一个正整数repeat(0 输入一个整型数组,数据元素有正数也有负数,求元素组合成连续子数组之和最大的子数组,要求时间复杂度为O(n)。 用筛选法可得到2~n(n<10000)之间的所有素数,方法是:首先从素数2开始,将所有2的倍数的数从数表中删去(把数表中相应位置的值置成0);接着从数表中找出下一个非0数,并从数表中删去该倍数的所有倍数; 以此类推,直到所找到的下一个数等于n为止。这样会得到一个序列:2,3,5,7,11,13,17,19,23... 一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出N之内的所有完数,并按下面格式输出其因子 python for i in range(n,m)注意... 第八题:牛牛的作业薄上有一个长度为 n 的排列 A,这个排列包含了从1到n的n个数,但是因为一些原因,其中有一些位置(不超过 10 个)看不清了,但是牛牛记得这个数列顺序对的数量是 k,顺序对是指满足 i < j 且 A[i] < A[j] 的对数,请帮助牛牛计算出,符合这个要求的合法排列的数目。 【JAVA习题八】一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程 找出1000以内的所有完数。 一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程 找出1000以内的所有完数。 编程题:一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程 找出1000以内的所有完数。
 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM