[DFS]poj1416

来源:互联网 发布:滴滴待遇 知乎 编辑:程序博客网 时间:2024/05/22 11:58

题意:
输入整数串,然后计算分割成小于等于Target的最大的和

如果输入的串分割后的和最小都比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 10000000using 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;        }    }}
0 0