这题没啥好说的,就是将字符串num分割成好几个整数,并相加起来,看看哪种分割情况的和是最接近 t 的
因为每个num最多只有6位,所以总共的分割情况也就32种,非常简单,只要能写出dfs函数就可以了
#include<iostream>
#include<string>
using namespace std;
int t,flag,k,ansn,len,Max,v[100],vn;
char num[8];
int ans[8],a[8];
int power(int x,int y)
{
while(y--)
x*=10;
return x;
}
void dfs(int f,int sum,int n)
{
int i,j,l;
if(f==len)
{
if(sum<=t) //如果小于t说明已经肯定有max,flag标记1
{
flag=1;
if(sum>Max)
{
Max=sum;
for(i=0;i<n;i++) //将max和ans数组更新
ans[i]=a[i];
ansn=n;
}
v[vn++]=sum; //这个用于后面检测是否有重复的最大值
}
return ;
}
for(i=f;i<len;i++) //从f开始遍历,这个很重要
{
a[n]=0;
for(j=f;j<=i;j++)
a[n]+=power(num[j]-'0',i-j);
dfs(i+1,sum+a[n],n+1);
}
}
int main()
{
int i;
while(scanf("%d%s",&t,num),t!=0||strcmp(num,"0")!=0)
{
flag=k=vn=0;
len=strlen(num);
Max=-1;
dfs(0,0,0);
if(flag==0)
{
printf("error\n");
continue;
}
for(i=0;i<vn;i++)
if(v[i]==Max)
k++;
if(k>1)
printf("rejected\n");
else
{
printf("%d ",Max);
for(i=0;i<ansn;i++)
{
printf("%d",ans[i]);
if(i!=ansn-1)
cout<<" ";
else cout<<endl;
}
}
}
return 0;
}