这题主要还是理解题意。
给你一个数n,和一串长度不超过6的数字。问怎么分割这串数字可以使得分割后的数和不大于n,注意数字的顺序不能打乱。如有多个答案,取最接近n的解。
如果不能成功分割,输出error,如果有多个最佳答案,输出rejected。
解法很简单,就搜索一下就好了~
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int lim,a[8],la,ans,sum,v[8],mem[8],lm,lv;
bool flag;
void dfs(int dep)
{
int i;
/*for (i=0; i<lm; i++)
printf(" %d",mem[i]);
printf("\n");*/
if (dep == la)
{
sum=0;
for (i=0; i<lm; i++)
sum+=mem[i];
if (sum <= lim)
{
if (ans < sum)
{
ans=sum;
flag=false;
memcpy(v,mem,sizeof(v));
lv=lm;
}
else if (ans == sum)
{
flag=true;
}
}
return ;
}
mem[lm]+=a[dep];
lm++;
dfs(dep+1);
lm--;
if (dep != la-1)
{
mem[lm]*=10;
dfs(dep+1);
mem[lm]/=10;
}
mem[lm]-=a[dep];
}
int main()
{
int i,j;
char str[10];
while (1)
{
scanf("%d%s",&lim,str);
if (lim == 0)
break;
for (i=0; str[i]; i++)
{
a[i]=str[i]-'0';
}
la=i;
sum=0;
ans=-1;
memset(v,0,sizeof(v));
memset(mem,0,sizeof(mem));
flag=true;
lm=0;
dfs(0);
if (ans == -1)
{
printf("error\n");
continue;
}
if (flag == true)
{
printf("rejected\n");
}
else
{
printf("%d",ans);
for (i=0; i<lv; i++)
printf(" %d",v[i]);
printf("\n");
}
}
}