" (๋ฐฑ์ค/ C++) 7579 - ์ฑ "
https://www.acmicpc.net/problem/7579
7579 - ์ฑ
์ ๋ ฅ์ 3์ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ์ฒซ ์ค์๋ ์ ์ N๊ณผ M์ด ๊ณต๋ฐฑ๋ฌธ์๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ฉฐ, ๋์งธ ์ค๊ณผ ์ ์งธ ์ค์๋ ๊ฐ๊ฐ N๊ฐ์ ์ ์๊ฐ ๊ณต๋ฐฑ๋ฌธ์๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์ N๊ฐ์ ์ ์๋ ํ์ฌ ํ์ฑํ ๋์ด ์๋ ์ฑ A1, ..., AN์ด ์ฌ์ฉ ์ค์ธ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํธ ์์ธ m1, ..., mN์ ์๋ฏธํ๋ฉฐ, ์ ์งธ ์ค์ ์ ์๋ ๊ฐ ์ฑ์ ๋นํ์ฑํ ํ์ ๊ฒฝ์ฐ์ ๋น์ฉ c1, ..., cN์ ์๋ฏธํ๋ค.
www.acmicpc.net
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ํ์ด์ผ ํ๋ ๋ฌธ์ .
์ฒ์์๋ ๋ฌด๊ฒ๋ก DP๋ฅผ ๋ง๋ค๋ฉด ๋๊ฒ ๋ค ~ ํ์ง๋ง ?? ๋ฌด๊ฒ(M)์ด ์ต๋ 10,000,000 ์ด์๋ค. DP[ n ][ m ] ์ด๊ฑด ๋ฉ๋ชจ๋ฆฌ ์ ๋ถ๊ฐ๋ฅ ํ ๊ฑฐ ๊ฐ๋ค..
Memory : 10,000,000
N : 100
arr [N][M] 10,000,000 x 100 x 4byte = 4,000,000,000
์ ํ ๋ฉ๋ชจ๋ฆฌ [ 128mb ] = 128 x 1024kb = 128 x 1024 x 1024byte = 134,217,728
Memory๊ฐ ์๋๋ฉด ๋จ์ ๊ฑด ๋น์ฉ N : 100 x Cost 100 = 10,000
์ด ๋ฌธ์ ๋ ๋ ์ ๋ฌธ์ ๋ฅผ ์์ฉํ ๋ฌธ์ ๋ค.
์ด : ๋ช ๋ฒ์งธ ์ด์ธ๊ฐ?
1์ด [ 0 ] [ 0 ] [ 30 ] -> cost 3์ด๋ฉด ์ฌ์ง ํ์ด๋ผ์ดํฐ memory๋ฅผ ํ๋ณด ํ ์ ์๊ณ ์ค๋ณต์ด ๋์ง ์๊ธฐ ๋๋ฌธ์ cost 15์ฌ๋ ์ต๋ 30์ด๋ค.
์ด๋ ์์ ์ ๊ฐฑ์ ๋๋์ง๋ ์ดํด๋ณด์.
cost [ 1 ] = 3 , cost [ 2 ] = 0 , cost [ 3 ] = 3 , cost [ 4 ] = 5 , cost [ 5 ] = 4 ๋ผ๊ณ ํ ๋
3์ด์ ๋ณด๋ฉด DP[ 3 ][ 3 ], DP[ 3 ][ 6 ]์ ๊ฐฑ์ ๋๋ค. cost [ 3 ] ์ 3 ์ด๊ธฐ ๋๋ฌธ์ DP [ n ] [ mcostIdx ] mCostId >=3 ๋ณด๋ค ํด ๋๋ถํฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฃ์์ง ๋ง์ง ํ๋จ ํ ์ ์์ผ๋ฉฐ
์ ํ์์ ๋ง๊ฒ โ DP[ 3 ][ 3 ] = DP[ 2 ][ 0 ] + memory[ 3 ] = 10 + 20 = 30 โ ๋ฒ ํ๋์
DP[n-1][cost] ๊ฐ์ ๋น์ฉ์ธ๋ฐ C๋ฅผ ๋ฃ์ง์๊ณ A, B๋ฅผ ๋ฃ์ โก DP[ 2 ][ 3 ] ์ด ๋ ํฌ๋ค๋ฉด DP[ 3 ][ 3 ]์ 40์ด๋๋ค.
์ฆ, max (โ , โก) ๋ค.
๊ทธ๋์ ์๋์ ๊ฐ์ ์ฝ๋๊ฐ ์์ฑ๋๋ค
์ด๋ ค์ ๋ค.
๋ค๋ฅธ ์ฌ๋๋ค ์ฝ๋๋ ๋ณด๊ณ ํผ์ ๊ทธ๋ฆผ๋ง ๋ช ๋ฒ ๊ทธ๋ฆฐ์ง ๋ชจ๋ฅด๊ฒ ๋ค.
else๋ฅผ ๋ฃ์ผ๋ฉด ์ ์ ๋๋์ง๋ ๊ณ์ ๊ณ ๋ฏผ ํ๋ค..
์์ ์ค๋ช ํ 3์ด ์ด์ผ๊ธฐ๋ฅผ ๋ณด๋ฉด์ ์ ~~ ์๊ฐํ๋ฉด else๊ฐ ์ ์๋๋์ง ์์ ์๋ค.
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int gN; // - n์ ์ต๋ 100
int gMaxMemory; // - max ๋ฉ๋ชจ๋ฆฌ
int gCost[101];
int gMemory[101];
int DP[101][100 * 100 + 1];
int main(void)
{
cin >> gN >> gMaxMemory;
int mMaxCost = 0;
for (int idx = 1; idx <= gN; ++idx)
{
cin >> gMemory[idx];
}
for (int idx = 1; idx <= gN; ++idx)
{
cin >> gCost[idx];
mMaxCost += gCost[idx];
}
for (int idx = 1; idx <= gN; ++idx)
{
for (int aCost = 0; aCost <= mMaxCost; ++aCost)
{
if (aCost - gCost[idx] >= 0) // gCost[5] = 4์ผ ๋ 4๋ณด๋ค ์์ผ๋ฉด idx = 5๋ ํฌํจ๋ ์๊ฐ ์๋ค.
DP[idx][aCost] = max(DP[idx][aCost], DP[idx - 1][aCost - gCost[idx]] + gMemory[idx]);
//else
DP[idx][aCost] = max(DP[idx][aCost], DP[idx - 1][aCost]);
}
}
for (int aCost = 0; aCost <= mMaxCost; ++aCost)
{
if (DP[gN][aCost] >= gMaxMemory)
{
cout << aCost;
break;
}
}
return 0;
}
๋ง์ฝ ์ด์ง ์ ์ฝ๋ฉ ํ ์คํธ์ DP ๋์ค๋ฉด ๋ฉ๋ถ์ฌ๊ฑฐ ๊ฐ๋ค.
์ฝ๊ฒ ๋ ์๋ง ๋ด์ฃผ๋ฉด ์ข๊ฒ ๋ค ใ 0ใ ์ด์ดํ ..
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif)
'๐ coding test > โฝ ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
(๋ฐฑ์ค/ C++) 1520 - ๋ด๋ฆฌ๋ง๊ธธ / ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ (1) | 2024.07.18 |
---|---|
(๋ฐฑ์ค/ C++) 11049 - ํ๋ ฌ ๊ณฑ์ ์์ / ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ (0) | 2024.07.18 |
(๋ฐฑ์ค/ C++) 1106 - ํธํ / ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ (0) | 2024.07.11 |
(๋ฐฑ์ค/ C++) 2629 - ์ํ์ ์ธ (0) | 2024.07.09 |
(๋ฐฑ์ค/ C++) 11438 - LCA 2 / ํจ์จ์ ์ธ LCA(+sparse table) (0) | 2023.02.02 |
์ ํ๋ ๊ฒ ๋ณด๋ค ๋ซ๊ฒ ์ง
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!