πŸ“¦7579: μ•±


[μ•Œκ³ λ¦¬μ¦˜ 풀이] κ°•λ™κ·œ Reviewed by Kade Kang (devkade12@gmail.com) Reviewed:: 2024-02-18 문제 ν™•μΈν•˜κΈ°

풀이

  • DP λ₯Ό 많이 풀어보지 μ•Šμ•„μ„œ κ·ΈλŸ°κ°€ 아직도 DP κ°œλ…μ΄ μ’€ μ–΄λ ΅λ‹€.
  • dp[i][j] λŠ” i 번째 앱이 j λΉ„μš©μ„ μ‚¬μš©ν•΄μ„œ 확보할 수 μžˆλŠ” μ΅œλŒ€ λ©”λͺ¨λ¦¬λ₯Ό λœ»ν•œλ‹€.
  • dp[i-1][j-cost[i]]+bytes[i] 을 톡해 이전 μ•±μ—μ„œ j-cost[i] λΉ„μš©μœΌλ‘œ 확보할 수 μžˆλŠ” λ©”λͺ¨λ¦¬ + ν˜„μž¬ μ•±μ—μ„œ 확보할 수 μžˆλŠ” λ©”λͺ¨λ¦¬λ₯Ό κ°±μ‹ ν•΄μ€€λ‹€.
#include <iostream>
#include <algorithm>
#define endl '\n'
using namespace std;
 
int bytes[101], cost[101];
int dp[101][10001];
int N, M, sum = 0, res = INT32_MAX;
 
void Input(){
    cin >> N >> M;
    for(int i=1; i<=N; i++) {
        cin >> bytes[i];
    }
    for(int i=1; i<=N; i++) {
        cin >> cost[i];
        sum += cost[i];
    }
 
}
 
void Solution(){
    for(int i=1; i<=N; i++){
        for(int j=0; j<=sum; j++){
            if(j >= cost[i]){
                dp[i][j] = max(dp[i][j], dp[i-1][j-cost[i]]+bytes[i]);
            }
            dp[i][j] = max(dp[i][j], dp[i-1][j]);
            if(dp[i][j] >= M) {
                res = min(res, j);
            }
        }
    }
}
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
 
    Input();
    Solution();
    cout << res << endl;
 
    return 0;
}