[BOJ] ํ๋ฒํ ๋ฐฐ๋ญ(12865)
[๋ฐฑ์ค(BOJ)] ํ๋ฒํ ๋ฐฐ๋ญ(12865) C++
๋ฌธ์ : BOJ_12865๋ฒ ํ๋ฒํ ๋ฐฐ๋ญ
๋ฌธ์ ์ค๋ช
DP(๋ ์ ์๊ณ ๋ฆฌ์ฆ)
DP ๋ฌธ์ ์ค ์ ๋ช
ํ ๋ฌธ์ ์ธ ํ๋ฒํ ๋ฐฐ๋ญ
๋ฌธ์ ์
๋๋ค.
๋ฌผํ์ ์์ ๋ฐฐ๋ญ์ ๋ด์ ์ ์๋ ์ต๋ ๋ฌด๊ฒ๊ฐ ์ฃผ์ด์ง๋๋ค.
์ด์ด์ ๊ฐ๊ฐ ๋ฌผํ์ ๋ฌด๊ฒ์ ๊ฐ์น๊ฐ ์ฃผ์ด์ง๋ฉฐ, ๊ฐ๋ฐฉ ์์ ์ต๋ ๋ฌด๊ฒ๋ฅผ ์ด๊ณผํ์ง ์๊ฒ ๋ฃ์์ ๋ ์ต๋ ๊ฐ์น๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ ๋๋ค.
์ด๋ ์ฃผ์ํ ๊ฒ์ ๊ฐ๊ฐ์ ๋ฌผํ์ ํ๋๋ง ๋ค์ด๊ฐ ์ ์์ผ๋ฏ๋ก, ํ๋์ ๋ฌผํ์ด ์ค๋ณต๋๊ฒ ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ์ ์๋ ํผํด์ผ ํฉ๋๋ค.
Solution
dp๋ฅผ ์ด์ฉํ ํ์ด๋ฅผ ํด๋ดค์ต๋๋ค.
2์ฐจ์ dp๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ง๋ค์์ต๋๋ค.
dp[i ๋ฒ์งธ๊น์ง ๋ฌผ๊ฑด์ ์ฌ์ฉํ์ ๋][๋ฌด๊ฒ๊ฐ j ์ผ ๋] = ์ต๋๊ฐ
1~n๊น์ง์ ๋ฌผ๊ฑด์์ ํ์ฌ ์ต๋๊ฐ์ ์๊ณ ์ ํ๋ ๋ฌด๊ฒ๊ฐ j๋ผ๊ณ ํ์ ๋, 1~n ๋ฒ์ ๋ฌผ๊ฑด์ ์ฌ์ฉํ์ฌ j์ ๋ฌด๊ฒ์์ ๊ฐ์น์ ์ต๋๊ฐ์ ๊ฐฑ์ ํด ์ฃผ๋ dp ์์ ๋๋ค.
2์ค for ๋ฌธ์ ์ฒซ ๋ฒ์งธ for ๋ฌธ์์ 1~n๊น์ง์ ๋ฌผ๊ฑด์ ์ํํ๋ฉฐ, ๋ ๋ฒ์งธ ํฌ๋ฌธ์์ ๋ฐฐ๋ญ์ ์ต๋ ๋ฌด๊ฒ๋ฅผ ์ํํ๋ฉฐ dp ๊ฐ์ ๊ฐฑ์ ํด ์ค๋๋ค.
์ด๋ ์ฒ์ dp[i][j]์ ๊ฐ์ i ๋ฒ์งธ ๋ฌผ๊ฑด์ j ๋ฌด๊ฒ์์ ๋ด์ง ์์ ๊ฒฝ์ฐ, ์ฆ dp[i-1][j]๋ก ์ด๊ธฐํํด์ฃผ๊ณ ๊ฐ์ ๋น๊ตํด ์ฃผ์ด์ผ ํฉ๋๋ค.
๋น๊ตํด ์ค์ผ ํ๋ ๊ฐ์ dp[i][j-i ๋ฒ์งธ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ] + i ๋ฒ์งธ ๋ฌผ๊ฑด์ ๊ฐ์น
์ ๋น๊ตํด ์ค์ผ ํฉ๋๋ค.
์ด ๊ฐ์ i ๋ฒ์งธ ๋ฌผ๊ฑด์ ํ์ฌ ๋ฌด๊ฒ์ ๋ด์์ ๋์ ์ต๋ ๊ฐ์น์์ ์ ์ ์์ต๋๋ค.
์ฆ ํ์ฌ i ๋ฒ์งธ์ ๋ฌผ๊ฑด์ j ๋ฌด๊ฒ์์ ๋ด์์ ๋์ ๋ด์ง ์์ ๊ฒฝ์ฐ๋ฅผ ๋น๊ตํ๋ฉฐ dp๋ฅผ ๊ฐฑ์ ํด ์ค๋๋ค.
Description
- ๋ฌผ๊ฑด์ ๋ฌด๊ฒ์ ๊ฐ์น๋
pair<int,int>
๋ก ๋ด์์ฃผ์์ต๋๋ค.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<pair<int,int>> adj;
int dp[101][100001];
int n, k;
int main(){
cin >> n >> k;
adj.resize(n+1);
for(int i=1;i<=n;i++){
int w,v;
cin >> w >> v;
adj[i]={w,v};
}
for(int i=1;i<=n;i++){
for(int j=1;j<=k;j++){
dp[i][j]=dp[i-1][j];
if(j-adj[i].first>=0){
int value = dp[i-1][j-adj[i].first]+adj[i].second;
dp[i][j]=max(dp[i][j],value);
}
}
}
cout << dp[n][k] << '\n';
return 0;
}