メモ

自分に向けて書いたメモを取り扱っています.

AOJ 0220 Binary Digit A Doctor Loved

方針

深さ優先探索です.全探索なので頭悪い解法かなと思いながらもたかだかO(2^12)っぽいので余裕だろーとか思いながらやりました.

コード

double n;
double x[12];

int tmp[12];
int ans[12];

void dfs(int p, double sum)
{
    if(sum > n || p > 12)
        return;

    if(n == sum)
    {
        memcpy(ans, tmp, sizeof tmp);
        return;
    }

    tmp[p] = 1;
    dfs(p + 1, sum + x[p]);
    tmp[p] = 0;
    dfs(p + 1, sum);

    return;
}

int main()
{
    for(double i = 0, a = 1 << 7; i < 12; i++, a /= 2)
        x[static_cast<int>(i)] = a;

    while(cin >> n, n >= 0)
    {
        bool f = true;
        fill(ans, ans + 12, -1);
        dfs(0, 0);

        for(int i = 0; i < 12; i++)
            if(ans[i] < 0)
            {
                puts("NA");
                f = false;
                break;
            }

        if(f)
            for(int i = 0; i < 12; i++)
                cout << ans[i] << (i == 7 ? "." : "") << (i == 11 ? "\n" : "");
    }
}