空箱精進日記

精進精進アンド精進

AtCoder ABC 119 C - Synthetic Kadomatsu (300 点)

結論

それぞれの竹を、Aに使う、Bに使う、Cに使う、使わないに分類する。その組み合わせを全探索

考えていたこと

本営の解説と同じ方針には行き着いたのですが、実装力が足らず。。。
本番ではbit全探索で実装を試みていたので、後でアプローチしてみようと思います。

#include <bits/stdc++.h>

using namespace std;

int N, A, B, C;
int l[10];


int dfs(int cur, int a, int b, int c) {
    if (cur == N) {
        if (min({a, b, c}) > 0) {
            return abs(a - A) + abs(b - B) + abs(c - C) - 30;
        } else {
            return INT_MAX - 10;
        }
    }
    int ret0 = dfs(cur + 1, a, b, c);
    int ret1 = dfs(cur + 1, a + l[cur], b, c) + 10;
    int ret2 = dfs(cur + 1, a, b + l[cur], c) + 10;
    int ret3 = dfs(cur + 1, a, b, c + l[cur]) + 10;
    
    return min({ret0, ret1, ret2, ret3});
}


int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    cin >> N >> A >> B >> C;
    for (int i = 0; i < N; ++i) {
        cin >> l[i];
    }

        
    int res = dfs(0, 0, 0, 0);

    cout << res << endl;
    
    return 0;
}