#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); }