๋ฌธ์
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
ํ์ด
์ด ๋ฌธ์ ๋ ๋ํ์ ์ธ 0-1 knapsack(๋ฐฐ๋ญ) ๋ฌธ์ ์ด๋ค. ๋ฌด๊ฒ์ ํ๊ณ๊ฐ ์ ํด์ ธ ์์ ๋ ์ต๋์ ๊ฐ์น๋ฅผ ๊ฐ์ง๋๋ก ๋ฌผ๊ฑด์ ๋ฐฐ๋ญ์ ๋ฃ์ผ๋ฉด ๋๋ค.
- ๋ฐฐ๋ญ์ ๋ฌผ๊ฑด์ ๋ฃ๋ ๊ฒฝ์ฐ(1), ๋ฃ์ง ์๋ ๊ฒฝ์ฐ(0)๋ก ๋ฌธ์ ๊ฐ ์๊ฒ ์ชผ๊ฐ์ง ์ ์๋ค.
- ๋ฌผ๊ฑด์ ๋ฃ์ ๋๋ ๋ฌด๊ฒ์ ๊ฐ์น๋ฅผ ๋ชจ๋ ๊ณ ๋ คํ๋ค.
๋ฌธ์ ์์ ๊ฐ๊ฐ์ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ์ ๊ฐ์น๋ ๋ค์๊ณผ ๊ฐ๋ค.
๋ฌด๊ฒ | 6 | 4 | 3 | 5 |
๊ฐ์น | 13 | 8 | 6 | 12 |
๋ฌด๊ฒ์ ํ๊ณ๊ฐ 7์ด๋ผ๊ณ ํ์ ๋, ๋ฌธ์ ๋ฅผ NS("1234", 7) ์ด๋ผ๊ณ ์ ์ํ์.
์ด ๋ฌธ์ ๋ฅผ (1) 4๋ฒ์งธ ๋ฌผ๊ฑด์ ๋ฃ๋ ๊ฒฝ์ฐ, (2) 4๋ฒ์งธ ๋ฌผ๊ฑด์ ๋ฃ์ง ์๋ ๊ฒฝ์ฐ๋ก ์ชผ๊ฐค ์ ์๋ค.
(1) NS("123", 7-4๋ฒ์งธ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ) + 4๋ฒ์งธ ๋ฌผ๊ฑด์ ๊ฐ์น = NS("123", 2) + 12
(2) NS("123", 7)
์ต๋์ ๊ฐ์น๋ฅผ ๊ฐ์ ธ์ผ ํ๋ฏ๋ก ์ 2๊ฐ์ง์ ๊ฒฝ์ฐ ์ค max ๊ฐ์ NS("1234", 7)์ ๊ฐ์ผ๋ก ์ค์ ํ๋ฉด ๋๋ค.
์ ๋ด์ฉ์ ์ผ๋ฐํํ๋ฉด, NS(n, w) = max(NS(n-1, w - wi) +vi, NS(n-1, w)) ๋ก ์ ํ์์ ์ธ์ธ ์ ์๋ค.
- n : ์ ํํ ์ ์๋ ๋ฌผ๊ฑด์ ๊ฐ์
- w : ๋ฌด๊ฒ์ ํ๊ณ
- wi : i๋ฒ์งธ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ
- vi : i๋ฒ์งธ ๋ฌผ๊ฑด์ ๊ฐ์น
๊ฐ๋ค์ ์ฑ์๊ฐ ๋ ๊ณ ๋ คํด์ผ ํ ๊ฒ์ด ๋ฌด๊ฒ, ๊ฐ์น๋ก 2๊ฐ์ง ์ด๋ฏ๋ก ๊ฐ์ 2์ฐจ์ ๋ฐฐ์ด d[n][w]์ ์ฑ์ด๋ค.
๋ฌด๊ฒ๊ฐ 0์ด๊ฑฐ๋ 0๋ฒ์งธ ๋ฌผ๊ฑด์ ์์ผ๋ฏ๋ก 2์ฐจ์ ๋ฐฐ์ด์์ ์๋์ ๊ฐ์ด ์ด๊ธฐ๊ฐ์ ์ฑ์ด๋ค.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | |||||||
2 | 0 | |||||||
3 | 0 | |||||||
4 | 0 |
- ๋ฌผ๊ฑด์ ๋ฌด๊ฒ <= ํ์ฌ ๋ฌด๊ฒ ํ๊ณ
- d[i][j] = max(d[i-1][j-w[i]] + v[i], d[i-1][j])
- ํ์ฌ ๋ฌด๊ฒ ํ๋ ๋ด์ ๋ฌผ๊ฑด์ ๋ฃ์ ์ ์์ผ๋ฏ๋ก ๋ฃ์์ ๋, ๋ฃ์ง ์์์ ๋๋ฅผ ๋น๊ตํ์ฌ ์ต๋์ ๊ฐ์น๋ฅผ ์ ํํ๋ค.
- ๋ฌผ๊ฑด์ ๋ฌด๊ฒ > ํ์ฌ ๋ฌด๊ฒ ํ๊ณ
- d[i][j] = d[i-1][j]
- ํ์ฌ ๋ฌด๊ฒ ํ๋ ๋ด์ ๋ฌผ๊ฑด์ ๋ฃ์ ์ ์์ผ๋ฏ๋ก ๋ฃ์ง ์์์ ๋์ ๊ฐ์ด ๊ฐ์น๊ฐ ๋๋ค.
์ ์ ์ฐจ์ ๋ฐ๋ผ ๋ฐฐ์ด์ ์ฑ์ฐ๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๋๋ค.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
1 | 0 | 0 | 0 | 0 | 0 | 13 | 13 | |
2 | 0 | 0 | 0 | 8 | 8 | 13 | 13 | |
3 | 0 | 0 | 6 | 8 | 8 | 13 | 14 | |
4 | 0 | 0 | 6 | 8 | 12 | 13 | 14 |
๋ฐ๋ผ์ ๊ฒฐ๊ณผ๊ฐ์ d[๋ฌผ๊ฑด์ ๊ฐ์][๋ฌด๊ฒ์ ํ๊ณ]๋ก ์ป์ ์ ์๋ค.
์ฝ๋
#include <iostream>
#include <algorithm>
using namespace std;
int n, k; // ๋ฌผํ ์, ๋ฒํธ ์ ์๋ ๋ฌด๊ฒ
int w[105], v[105]; // ๊ฐ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ, ํด๋น ๋ฌผ๊ฑด์ ๊ฐ์น
int d[105][100005]; // [๋ช๋ฒ์งธ ๋ฌผ๊ฑด, ๋ฌด๊ฒ ํ๋] ์ผ๋ optimal profit
/**
* - wi <= w ์ผ ๋
* d[i][w] = max(d[i-1][w-wi] + vi, d[i-1][w])
* - wi > w ์ผ ๋
* d[i][w] = d[i-1][w]
*/
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
cin >> w[i] >> v[i];
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= k; j++)
{
if (w[i] <= j)
d[i][j] = max(d[i - 1][j - w[i]] + v[i], d[i - 1][j]);
else
d[i][j] = d[i - 1][j];
}
}
cout << d[n][k];
}
'CS > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ์์ด, ์กฐํฉ, ์ค๋ณต์์ด, ์ค๋ณต์กฐํฉ (0) | 2023.04.19 |
---|---|
[BOJ 17609] ํ๋ฌธ - Java (0) | 2023.03.17 |
[BOJ 14916] ๊ฑฐ์ค๋ฆ๋ - C++ (0) | 2022.07.19 |