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