#include<stdio.h>
#include<stdlib.h>
#define N 100
int m,len=1;
int w[N];
bool x[N];
void print(bool x[],int n){//输出当前解
printf("{ ");
for(int i=1;i<=n;i++){
if(x[i]==1) printf("%d ",i);
}
printf("}");
}
void subset(int t,int k,int r){
x[k]=1;
if(t+w[k]==m){
print(x,k);
}
else{
//现在条件为t+w[k]<m或者t+w[k]>m,
//(1)如果t+w[k] > m,那么必定无解,因为假设的t<m,现在t+w[k] > m,必定无解;
//(2)如果t+w[k]<m,那么可能有解,
if(t+w[k]+w[k+1] <= m){//选择w[k],对应情况(2),此时自动满足t+w[k]<=m和(t+w[k])+ (r-w[k])>m
subset(t+w[k],k+1,r-w[k]);
}
if((t+r-w[k] >= m) && (t+w[k+1] <= m)){//对应不选择w[k],此时t+0<m自动满足(0是因为因为没有选择w[k])
x[k]=0;
subset(t,k+1,r-w[k]);
}
}
}
int main(){
int t,r;
char c;
while(scanf("%d",&w[len++])){
c=getchar();
if(c=='\n') break;
}
printf("m:");
scanf("%d",&m);
t=r=0;
for(int i=1;i<len;i++){
r+=w[i];
}
subset(t,1,r);
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。