HDU 1539(Shredding Company)

深搜題。

#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 25;

int n; //目標數字
char str[MAXN]; //輸入帶
int len; //輸入帶長度
int ans, flag; //滿足要求的最大和
int tmpPath[MAXN]; //臨時路徑
int tmpIdx;
int path[MAXN]; //最終路徑
int idx;

void DFS(int pos, int sum)
{
    if (sum > n)
        return;
    if (pos == len)
    {
        if (sum <= n && sum >= ans)
        {
            if (sum == ans)
                flag = 2;
            else
            {
                ans = sum, idx = 0, flag = 1;
                for (int i = 0; i < tmpIdx; i++)
                    path[idx++] = tmpPath[i];
            }
        }
        return;
    }
    int tmp = 0;
    for (int i = pos; i < len; i++)
    {
        tmp = tmp * 10 + str[i] - '0';
        tmpPath[tmpIdx++] = tmp; //存儲路徑
        DFS(i + 1, sum + tmp);
        tmpIdx--;
    }
}

int main()
{
    while (~scanf("%d%s", &n, str) && n && str[0] != '0')
    {
        len = strlen(str);
        memset(tmpPath, 0, sizeof(tmpPath));
        memset(path, 0, sizeof(path));
        tmpIdx = 0, ans = 0, flag = 0;
        DFS(0, 0);
        if (flag == 0)
            cout << "error" << endl;
        else if (flag == 2)
            cout << "rejected" << endl;
        else
        {
            cout << ans;
            for (int i = 0; i < idx; i++)
                cout << " " << path[i];
            cout << endl;
        }
    }
    return 0;
}

繼續加油。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章