poj 1416 Shredding Company(dfs)

来源:互联网 发布:软件项目开发管理制度 编辑:程序博客网 时间:2024/05/18 01:35

参考题解:http://blog.csdn.net/lyy289065406/article/details/6647969
题意和思路在题解都有,思路很简单,奈何我写了好久愣是没实现出来。。。

#include <iostream>#include <cmath>#include <cstring>using namespace std;int aim,result,path,sum,p;int vist[1000000];int Mpow(int a, int b){    int res = 1;    while(b)    {        if(b & 1) res *= a;        a = a*a;        b >>= 1;    }    return res;}int getLen(int n){    return (int)log10(n)+1;}int getValue(char *s, int i){    int k = i;    int sum = 0;    int b,num,p;    while(k)    {        k--;        b = i-k-1;        num = s[k] - '0';        p = num*Mpow(10,b);        sum += p;    }    return sum;}int getHead(int n, int i){    int len = getLen(n);    if(len <= i)        return n;    return n/Mpow(10,len-i);}int getTail(int n, int i){    return n%Mpow(10,i);}void DFS(char *s, int len){    if(len == 0)    {        vist[sum]++;        if(sum > result && sum <= aim)        {            result = sum;            path = p;        }        return;    }    for(int i = 1; i <= len; ++i)    {        int a = getValue(s,i);        sum += a;        if(sum > aim)        {            sum -= a;            //continue;            return;        }        p = p*10+i;        char b[7];        int j = 0;        for(int k = i; k < len; ++k)            b[j++] = s[k];        b[j] = '\0';        DFS(b,len-i);        sum -= a;        p /= 10;    }    return;}int main(){    while(true)    {        char s[7];        cin >> aim >> s;        int len = strlen(s);        int n = getValue(s,len);        if(!aim && !n)            break;        if(aim == n)        {            cout << aim << " " << n << endl;            continue;        }        int num = n;        int k = 0;        while(num)        {            k += num%10;            num /= 10;        }        if(k > aim)        {            cout << "error" << endl;            continue;        }        result = -1;        sum = 0;        path = 0;        p = 0;        memset(vist,0,sizeof(vist));        DFS(s,len);        if(vist[result] > 1)            cout << "rejected" << endl;        else if(vist[result] == 1)        {            cout << result << " ";            int L = getLen(path);            for(int i = 1; i <= L; ++i)            {                int k = getHead(path,1);                cout << getHead(n,k) << " ";                n = getTail(n,len-=k);                path = getTail(path,L-i);            }            cout << endl;        }    }    return 0;}
0 0