12865๋ฒ: ํ๋ฒํ ๋ฐฐ๋ญ
์ฒซ ์ค์ ๋ฌผํ์ ์ N(1 ≤ N ≤ 100)๊ณผ ์ค์๊ฐ ๋ฒํธ ์ ์๋ ๋ฌด๊ฒ K(1 ≤ K ≤ 100,000)๊ฐ ์ฃผ์ด์ง๋ค. ๋ ๋ฒ์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฑฐ์ณ ๊ฐ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ W(1 ≤ W ≤ 100,000)์ ํด๋น ๋ฌผ๊ฑด์ ๊ฐ์น V(0 ≤ V ≤ 1,000)
www.acmicpc.net
โจ ๋ด ์์ค ์ฝ๋
#include<iostream>
#include <string>
#include<algorithm>
using namespace std;
int N, K, dp[101][100001], W[101], V[101];
int main(void) {
ios::sync_with_stdio(false);
cin.tie(NULL);
int N, K;
cin >> N >> K;
for (int i = 0; i < N; i++) {
cin >> W[i] >> V[i];
}
for (int i = 0; i <= N; i++) {
for (int j = 0; j <= K; j++) {
if (i == 0) {
if (j - W[i] >= 0) {
dp[i][j] = V[i];
}
}
else {
dp[i][j] = dp[i - 1][j];
if (j - W[i] >= 0) {
dp[i][j] = max(dp[i][j], dp[i - 1][j - W[i]] + V[i]);
}
}
}
}
cout << dp[N][K] << endl;
return 0;
}
๐ ๋ฌธ์ ํ์ด
dp๋ฐฐ์ด์ dp[๋ฌผ๊ฑด][๋ฌด๊ฒ] = ๊ฐ์ด์น ๋ฅผ ์๋ฏธํ๋ค
๋ฐฑ์ค์ ์์ ์ ๋ ฅ์ผ๋ก ์ ์ฝ๋์ DP ๋ฐฐ์ด์ ์ดํด๋ณด๋ฉด

๋ค์๊ณผ ๊ฐ์ DP ๋ฐฐ์ด์ด ๋ง๋ค์ด์ ธ์ ๊ฒฐ๊ณผ์ธ dp[N][K] ๊ฐ์ผ๋ก๋ 14๊ฐ ์ถ๋ ฅ๋๊ฒ ๋๋ค
ํ๋์ฉ ์์ธํ ์ดํด๋ณด๋ฉด, ์ผ๋จ 1๋ฒ ๋ฌผ๊ฑด๋ง ๊ฐ์ง๊ณ ์์ ๋๋ฅผ ์ดํด๋ณด์ (dp[0])


๋ฌผ๊ฑด์ด 1๊ฐ ๋ฐ์ ์๊ธฐ ๋๋ฌธ์ ํ์ธ ํ ๊ฑด, ํ์ฌ ๋ฌด๊ฒ์ ํด๋น ๋ฌผ๊ฑด์ ๋ฃ์ ์ ์๋๋ ์๋๋ ๋ฟ์ด๋ค
๋ฌผ๊ฑด์ ๋ฃ์ ์ ์์ผ๋ฉด ๊ทธ๋๋ก 0, ๋ฃ์ ์ ์์ผ๋ฉด ํด๋น ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๋ฅผ ๋ฃ์ด์ค๋ค
1๋ฒ, 2๋ฒ 2๊ฐ์ ๋ฌผ๊ฑด์ ๊ฐ์ง๊ณ ์์ ๋๋ฅผ ์ดํด๋ณด์ (dp[1])


ํ์ฌ ๋ฌผ๊ฑด์ ๋ฃ์ง ์๋ ์์์ ๋์ ๊ฐ์ด์น์, ํ์ฌ ๋ฌผ๊ฑด์ ๋ฃ์์ ๋์ ๊ฐ์ด์น๋ฅผ ๋น๊ตํ์ฌ ๋ ํฐ ๊ฐ์ ์ทจํ๊ฒ ๋๋ค
dp[1][6]๊ฐ์ ๊ฒฝ์ฐ, dp[0][6] = 13๊ณผ dp[0][2]+8 = 8 ์ ๋น๊ตํ๊ฒ ๋๋ค 8๊ณผ 13์ค 13์ด๋ผ๋ ๊ฐ์ด ๋ ํฌ๊ธฐ๋๋ฌธ์ dp์ ์ ์ฅ
1๋ฒ, 2๋ฒ, 3๋ฒ 3๊ฐ์ ๋ฌผ๊ฑด์ ๊ฐ์ง๊ณ ์์ ๋๋ฅผ ์ดํด๋ณด์(dp[2])

dp[2][4]์ ๊ฒฝ์ฐ, dp[1][4] = 8 ๊ณผ dp[1][1] + 6 = 6์ ๋น๊ตํ๊ฒ ๋๋ค. ๋ ์ค ํฐ ๊ฐ์ ์ทจํด์ dp์ ์ ์ฅ
๋๋จธ์ง์ ๊ฒฝ์ฐ๋ ์์ ๊ฐ์ด ์งํ๋๊ฒ ๋๋ค
โญ ๋ฌธ์ ํ์ด ๊ฒฐ๊ณผ
