Skip to main content
  1. Posts/
  2. Algorithm/

BOJ 30208 휴가 나가기

·244 words·2 mins
Jiho Kim
Author
Jiho Kim
달려 또 달려

📝 문제 정보
#

🧐 관찰 및 접근
#

  • 업무들의 순서때문에, 자유롭게 선택하지 못하는 경우들이 생긴다.
    • 이게 어떤 느낌이지?
    • ![[Drawing 2026-02-07 15.51.45.excalidraw.png]]
    • 예제 입력 1의 순서는 다음과 같다.
      • $1 \rightarrow 2 \rightarrow 3$을 보자.
        • $1$까지 수행해서 중요도 $w_1$, 처리시간 $t_1$을 얻을 수 있다.
        • $2$까지 수행해서 중요도 $w_1 + w_2$, 처리시간 $t_1 + t_2$를 얻을 수 있다.
        • $3$까지 수행해서 $\cdots$
      • 저렇게 물건을 만들고 나면, 세개중에서 택1을 하는것 빼고는 배낭문제와 동일해진다.
        • 트리 dfs로 냅색을 잘 돌면서 DP를 할 수 있을 것 같다.
        • 근데 안에서 분기가 일어나면…
          • 0이 아닌 모든 $p_i$들은 모두 다르다
          • 라는 문장이 입력에 있다.

💻 풀이
#

  • 코드 (C++):
void dfs(int cur, int root, int w, int t){
    w += W[cur];
    t += T[cur];
    bags[root].push_back({w, t});
    for(auto nxt: links[cur]) dfs(nxt, root, w, t);
}

void solve(){
    cin >> N >> S;
    rep(i, 1, N+1) cin >> W[i];
    rep(i, 1, N+1) cin >> T[i];
    rep(i, 1, N+1){
        int p; cin >> p;
        links[p].push_back(i);
    }

    for(auto nxt: links[0]) dfs(nxt, nxt, 0, 0);
    rep(i, 0, N+2) rep(j, 0, S+1) KS[i][j] = 1e9;
    KS[0][0] = 0;
    rep(i, 0, N+1) rep(j, 0, S+1) {
        KS[i+1][j] = min(KS[i+1][j], KS[i][j]);
        for(auto [w, t]: bags[i]){
            int nxt = min(S, j + w);
            // }
            KS[i+1][nxt] = min(KS[i+1][nxt], KS[i][j] + t);
        }
    }


    if(KS[N+1][S] == 1e9) cout << -1;
    else cout << KS[N+1][S];
}
🔒

구현 코드 잠금

아래 쿠팡 링크를 방문하시면 코드가 공개됩니다.
광고 수익이 블로그 운영에 도움이 됩니다 🙏

🛒 쿠팡 방문하고 코드 보기

방문 후 잠금이 자동으로 해제됩니다