记录把等式移项后正数的位置,让这些正数之和等于sum/2,dfs搜索这些正数,再把剩余的数依次放入负数的位置,按照输入输出即可
#include<cstdio>
#include<cstring>
#include<ctype.h>
#define N 17
int num[N],n,zh;
int flag[N],end,sum;
char ch[100];
int ok;
void dfs(int w,int tmp,int st,int t)
{
if(t>n)
return;
if(tmp>sum)
return;
if(w==zh)
{
if(tmp==sum)
{
end=st;
ok=1;
}
else
return;
}
dfs(w+1,tmp+num[t],st|(1<<t),t+1);
dfs(w,tmp,st,t+1);
}
int main()
{
int i,j,k,l;
while(gets(ch))
{
l=strlen(ch);
memset(flag,0,sizeof(flag));
memset(num,0,sizeof(num));
sum=j=n=0;
flag[0]=1;
k=1<<30;
int f=1;
zh=1;
ok=0;
for(i=0;i<l;i++)
{
if(ch[i]=='=')
{
f++;
k=i;
}
if(isdigit(ch[i]))
{
sscanf(ch+i,"%d",&num[n++]);
sum+=num[n-1];
for(;isdigit(ch[i]);i++);
}
if(i<k)
{
if(ch[i]=='+')
{
flag[f++]=1;
zh++;
}
else if(ch[i]=='-')
f++;
}
if(i>k)
{
if(ch[i]=='+')
f++;
else if(ch[i]=='-')
{
flag[f++]=1;
zh++;
}
}
}
if(sum%2)
printf("no solution\n");
else
{
sum=sum/2;
dfs(0,0,0,0);
if(!ok)
{
printf("no solution\n");
continue;
}
int zheng=0,fu=0;
int a[N];
for(i=0;i<n;i++)
{
if(end&(1<<i))//放正数
{
for(j=zheng;j<n;j++)
{
if(flag[j])
{
a[j]=num[i];
zheng =j+1;
break;
}
}
}
else
{
for(j=fu;j<n;j++)
{
if(!flag[j])
{
a[j]=num[i];
fu=j+1;
break;
}
}
}
}
j=0;
for(i=0;i<l;i++)
{
if(isdigit(ch[i]))
{
printf("%d",a[j++]);
for(;isdigit(ch[i]);i++);
i--;
}
else
printf("%c",ch[i]);
}
printf("\n");
}
}
return 0;
}