题意:给定两个数n,m。例如50 12346,问如何切割后面的那个数,使得所分成的数之和最靠近n;
#include<iostream>
#include<string.h>
using namespace std;
char str[100];
int a[100][100];
int sum,n,len;
int ans[100],t[100],ansn,res,cntn;
int s,k;
void dfs(int i)
{
if(i>=len)
{
if(s<=sum&&s==res)
{
cntn=2;
return;
}
if(s<=sum&&s>res)
{
cntn=1;
ansn=k;
res=s;
for(int kk=0;kk<k;kk++)
{
ans[kk]=t[kk];
// cout<<ans[kk]<<' ';
}
}
return ;
}
if(s+a[i][i]<=sum)
{
for(int j=i;j<len;j++)
{
s+=a[i][j];
t[k++]=a[i][j];
dfs(j+1);
s-=a[i][j];
k--;
}
}
}
int main()
{
while(scanf("%d%s",&sum,str)==2)
{
if(sum==0&&str[0]=='0')
break;
len=strlen(str);
int i,j;
int temp=0;
for(i=0;i<len;i++)
{
a[i][i]=str[i]-'0';
temp+=a[i][i];
for(j=i+1;j<len;j++)
{
a[i][j]=a[i][j-1]*10+str[j]-'0';
// cout<<a[i][j]<<endl;
}
}
if(temp>sum)
{
printf("error\n");
continue;
}
s=0;
k=0;
res=-1;
dfs(0);
if(cntn>1)
printf("rejected\n");
else
{
printf("%d %d",res,ans[0]);
for(i=1;i<ansn;i++)
printf(" %d",ans[i]);
puts("");
}
}
return 0;
}