šŸ•ļø PS (BOJ)/Dynamic Programming

[BOJ][C++] 백준 12865번: ķ‰ė²”ķ•œ ė°°ė‚­

선달 2025. 4. 30. 00:18
ė°˜ģ‘ķ˜•

https://www.acmicpc.net/problem/12865

 

12865번: ķ‰ė²”ķ•œ ė°°ė‚­

첫 줄에 ė¬¼ķ’ˆģ˜ 수 N(1 ≤ N ≤ 100)ź³¼ ģ¤€ģ„œź°€ 버틸 수 ģžˆėŠ” 묓게 K(1 ≤ K ≤ 100,000)ź°€ 주얓진다. 두 번째 줄부터 Nź°œģ˜ 줄에 거쳐 각 ė¬¼ź±“ģ˜ 묓게 W(1 ≤ W ≤ 100,000)와 핓당 ė¬¼ź±“ģ˜ ź°€ģ¹˜ V(0 ≤ V ≤ 1,000)

www.acmicpc.net

 

문제

ģ“ ė¬øģ œėŠ” 아주 ķ‰ė²”ķ•œ 배낭에 ź“€ķ•œ ė¬øģ œģ“ė‹¤.

ķ•œ 달 후멓 źµ­ź°€ģ˜ ė¶€ė¦„ģ„ ė°›ź²Œ ė˜ėŠ” ģ¤€ģ„œėŠ” ģ—¬ķ–‰ģ„ 가려고 ķ•œė‹¤. ģ„øģƒź³¼ģ˜ ė‹Øģ ˆģ„ ģŠ¬ķ¼ķ•˜ė©° ģµœėŒ€ķ•œ 즐기기 ģœ„ķ•œ ģ—¬ķ–‰ģ“źø° ė•Œė¬øģ—, 가지고 다닐 ė°°ė‚­ ė˜ķ•œ ģµœėŒ€ķ•œ ź°€ģ¹˜ ģžˆź²Œ 싸려고 ķ•œė‹¤.

ģ¤€ģ„œź°€ 여행에 ķ•„ģš”ķ•˜ė‹¤ź³  ģƒź°ķ•˜ėŠ” Nź°œģ˜ ė¬¼ź±“ģ“ ģžˆė‹¤. 각 ė¬¼ź±“ģ€ 묓게 W와 ź°€ģ¹˜ V넼 ź°€ģ§€ėŠ”ė°, 핓당 ė¬¼ź±“ģ„ 배낭에 ė„£ģ–“ģ„œ 가멓 ģ¤€ģ„œź°€ V만큼 즐길 수 ģžˆė‹¤. 아직 ķ–‰źµ°ģ„ ķ•“ė³ø ģ ģ“ ģ—†ėŠ” ģ¤€ģ„œėŠ” ģµœėŒ€ Kė§Œķ¼ģ˜ ė¬“ź²Œė§Œģ„ ė„£ģ„ 수 ģžˆėŠ” ė°°ė‚­ė§Œ 들고 다닐 수 ģžˆė‹¤. ģ¤€ģ„œź°€ ģµœėŒ€ķ•œ 즐거욓 ģ—¬ķ–‰ģ„ ķ•˜źø° ģœ„ķ•“ 배낭에 ė„£ģ„ 수 ģžˆėŠ” ė¬¼ź±“ė“¤ģ˜ ź°€ģ¹˜ģ˜ ģµœėŒ“ź°’ģ„ ģ•Œė ¤ģ£¼ģž.

ģž…ė „

첫 줄에 ė¬¼ķ’ˆģ˜ 수 N(1 ≤ N ≤ 100)ź³¼ ģ¤€ģ„œź°€ 버틸 수 ģžˆėŠ” 묓게 K(1 ≤ K ≤ 100,000)ź°€ 주얓진다. 두 번째 줄부터 Nź°œģ˜ 줄에 거쳐 각 ė¬¼ź±“ģ˜ 묓게 W(1 ≤ W ≤ 100,000)와 핓당 ė¬¼ź±“ģ˜ ź°€ģ¹˜ V(0 ≤ V ≤ 1,000)ź°€ 주얓진다.

ģž…ė „ģœ¼ė”œ ģ£¼ģ–“ģ§€ėŠ” ėŖØė“  ģˆ˜ėŠ” ģ •ģˆ˜ģ“ė‹¤.

출렄

ķ•œ 줄에 배낭에 ė„£ģ„ 수 ģžˆėŠ” ė¬¼ź±“ė“¤ģ˜ ź°€ģ¹˜ķ•©ģ˜ ģµœėŒ“ź°’ģ„ ģ¶œė „ķ•œė‹¤.

 

ķ’€ģ“1 - 2차원 dp

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>

using namespace std;

struct info {
    int w, v;
};

int knapback(int n, int k, vector<info> &product) {
    vector<vector<int>> dp(n+1, vector<int>(k+1, 0));
    
    for(int i=1; i<=n; i++) {
        for(int j=0; j<product[i].w; j++) {
            dp[i][j] = dp[i-1][j];
        }
        for(int j=product[i].w; j<=k; j++) {
            dp[i][j] = max(dp[i-1][j-product[i].w] + product[i].v, dp[i-1][j]);
        }
    }
    return dp[n][k];
}
int main() {
    int n, k;
    cin >> n >> k;
    vector<info> product(n+1,{0,0});
    for(int i=1; i<=n; i++)
        cin >> product[i].w >> product[i].v;
    
    cout << knapback(n, k, product);
    
    return 0;
}

/*
 */

 

ķ’€ģ“2 - 1차원 dp

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>

using namespace std;

struct info {
    int w, v;
};

int knapback(int n, int k, vector<info> &product) {
    vector<int> dp(k+1, 0);
    
    for(int i=1; i<=n; i++)
        for(int j=k; j>=product[i].w; j--)
            dp[j] = max(dp[j-product[i].w] + product[i].v, dp[j]);

    return dp[k];
}

int main() {
    int n, k;
    cin >> n >> k;
    vector<info> product(n+1,{0,0});
    for(int i=1; i<=n; i++)
        cin >> product[i].w >> product[i].v;
    
    cout << knapback(n, k, product);
    
    return 0;
}

/*
 */

 

 

 

25.04.30

// ķ’€ģ“ : https://whkakrkr.tistory.com

#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> ci;

int main() {
    ios_base::sync_with_stdio(false);
	cout.tie(NULL);
	cin.tie(NULL);
	
	// input
	int n, k;
	cin >> n >> k;
	vector<ci>wv(n);
	for(int i=0; i<n; i++) {
	    int w,v;
	    cin >> w >>v;
	    wv[i] = {w,v};
	}
	
	// solution
	sort(wv.begin(), wv.end());
	
	vector<int>dp(k+1, 0);
	for(int i=0; i<n; i++) {
	    int w = wv[i].first;
	    int v = wv[i].second;
	    
	    for(int j=k; j>=w; j--) {
	        dp[j] = max(dp[j-w] + v, dp[j]);
	    }
	}
	
	// output
	int ans = *max_element(dp.begin(), dp.end());
	cout << ans;
	
    return 0;
}
ė°˜ģ‘ķ˜•