题意:
如果输入的串分割后的和最小都比Target大,那就输出error.
如果有多种结果一样,那么就输出rejected.
否则,输出最大的和 和分别是哪些子串。
这个题都是整数,所以比较简单。
直接搜索所有的情况就好了,还有一点是打印路径,一般可以用path[]或者pre[]的数组表示,但是这里数据有点大我就用的map水过了。。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
#define read freopen("q.in","r",stdin)
#define LL long long
#define maxn 10000000
using namespace std;
int t,a;
int flag,res,kk;
map<int,int> pre;
int pow(int x,int n)
{
int res=1;
for(int i=0;i<n;i++)
{
res*=x;
}
return res;
}
void dfs(int x,int s,int k,int d)
{
if(s>t)return ;
if(x==0)
{
if(res==s)flag=1;
else if(s>res && s<=t)
{
kk=d;
res=s;
flag=0;
}
return ;
}
int i,j,cnt=0;
int tmp=x;
int b[10];
while(tmp)
{
b[cnt++]=tmp%10;
tmp/=10;
// cout<<b[cnt-1]<<" ";
}
//cout<<endl;
tmp=0;
j=1;
for(i=0;i<cnt;i++,j++)
{
tmp+=(b[i]*(pow(10,j-1)));
pre[s+tmp]=s;
dfs(x/(pow(10,j)),s+tmp,tmp,d+1);
}
return ;
}
bool check()
{
int tmp=a,res=0;
while(tmp)
{
res+=(tmp%10);
tmp/=10;
}
return res>t;
}
int main()
{
// read;
while(~scanf("%d%d",&t,&a) && t+a)
{
if(t==a)
{
cout<<a<<" "<<a<<endl;
continue;
}
else if(check())
{
cout<<"error"<<endl;
continue;
}
res=0;
flag=0;kk=0;
dfs(a,0,0,0);
if(flag)cout<<"rejected"<<endl;
else
{
cout<<res;
for(int i=0;i<kk;i++)
{
cout<<" "<<res-pre[res];
res=pre[res];
}
cout<<endl;
}
}
}
原文地址:http://blog.csdn.net/u010582475/article/details/45819681