已知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("
");
        }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);
    }
原文地址:https://www.cnblogs.com/lls1350767625/p/8035364.html