因为原题面太长我就不粘了2333
这个题一看就是搜索啊。枚举每次的切点并记录位置,最后再判断一下是否不大于目标数并与目标数更接近,同时统计当前最优答案出现的次数。如果出现多次就输出rejected。如果把纸片上的数字都一个个隔开后的和还大于目标数,就输出error。
代码QWQ
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int N,M,cnt,sum=0,maxn=-1,Ans,f=0;
int num[10],a[10],ans[10],Num[10];
void dfs(int n,int k) // n 表示当前切割到第i个数后,k表示有几个切点。
{
if(n==cnt)
{
sum=0;
for(int i=1;i<=k;++i)
{
int x=0;
for(int j=a[i-1]+1;j<=a[i];++j)
x=x*10+num[j];
sum+=x;
}
if(sum>N) return ;
if(sum>maxn)
{
f=0;
maxn=sum;
Ans=k;
for(int i=1;i<=k;++i)
{
ans[i]=0;
for(int j=a[i-1]+1;j<=a[i];++j)
ans[i]=ans[i]*10+num[j];
}
}
else if(sum==maxn) f=1;
}
for(int i=n+1;i<=cnt;++i)
{
a[k+1]=i;
dfs(i,k+1);
a[k+1]=0;
}
}
int main()
{
scanf("%d%d",&N,&M);
while(N&&M)
{
sum=0;
f=0;
maxn=-1;
memset(a,0,sizeof(a));
memset(ans,0,sizeof(ans));
cnt=0;
if(N==M)
{
printf("%d %d\n",N,M);
scanf("%d%d",&N,&M);
continue;
}
while(M)
{
Num[++cnt]=M%10;
M/=10;
sum+=Num[cnt];
}
if(sum>N) {
printf("error\n");
scanf("%d%d",&N,&M);
continue;
}
for(int i=1;i<=cnt;++i)
num[i]=Num[cnt-i+1];
dfs(0,0);
if(f) printf("rejected\n");
else
{
printf("%d ",maxn);
for(int i=1;i<=Ans;++i)
printf("%d ",ans[i]);
printf("\n");
}
scanf("%d%d",&N,&M);
}
return 0;
}