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