已知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刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM