这个题也是DFS题。
大意是说给你2个数,第一个为目标数,第二个为你要处理的数,要求将第二个数进行分割,使得各部分之和最接近目标数且必须小于目标数。
其实一个DFS就可以做出来,中间注意下数中的0的特殊处理,因为0也可以占位的,输出rejecter需要注意下
直接代码吧:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long goal,ans,ansa[20],coua,ita[20],coub,flag;
char snum[20],num2[20];
void DFS(int index,int sum,int num)
{
if(sum>goal)
return;
if(index>=strlen(snum))
{
if(num!=-1)
{
sum+=num;
if(sum>goal)
return;
ita[coub++]=num;
}
if(goal-sum<=goal-ans)
{
if(goal-sum==goal-ans)
{
if(coub!=coua)
flag=1;
else
{
for(int i=0;i<coub;i++)
if(ansa[i]!=ita[i])
{
flag=1;
break;
}
}
}
else
{
flag=0;
for(int i=0;i<coub;i++)
ansa[i]=ita[i];
coua=coub;
ans=sum;
}
}
if(num!=-1)
coub--;
return;
}
if(num!=-1)
{
ita[coub++]=num;
DFS(index+1,sum+num,snum[index]-'0');
ita[coub++]=snum[index]-'0';
DFS(index+1,sum+snum[index]-'0'+num,-1);
coub--;
coub--;
}
else
{
ita[coub++]=snum[index]-'0';
DFS(index+1,sum+snum[index]-'0',-1);
coub--;
}
if(num==-1)
DFS(index+1,sum,snum[index]-'0');
else
DFS(index+1,sum,num*10+snum[index]-'0');
}
int main()
{
while(scanf("%lld%s",&goal,&snum)&&goal)
{
ans=0;
flag=coua=coub=0;
DFS(0,0,-1);
if(ans==0)
printf("error\n");
else
{
if(flag)
printf("rejected\n");
else
{
printf("%lld",ans);
for(int i=0;i<coua;i++)
printf(" %lld",ansa[i]);
printf("\n");
}
}
}
return 0;
}