[TIL] 130 [C#] ๋ฐฐ๋ญ, DP
์นดํ ๊ณ ๋ฆฌ: Til
๋ฐฐ๋ญ
DP
๋ฐฐ๋ญ๋ฌธ์
๋ฌธ์ ์์
๋ฐฐ๋ญ์ ๋ฌผ๊ฑด์ ๋ฃ์ ๋ ๋ฐฐ๋ญ์ ๋ค์ด๊ฐ ์ ์๋ ๋ฌด๊ฒ(k), ๋ก ์ต๋๊ฐ์น๋ก ๋ฌผ๊ฑด(n)๊ฐ ๋ฐฐ๋ญ์ ๋ด๊ธฐ.
์์
int[n,k] dp
1 ~ n๋ฒ์งธ ๋ฌผ๊ฑด์ k์ดํ๋ก ๋ด์ ๋ ์ต๋์ ๊ฐ์น = dp[n,k]
/* ์
๋ ฅ
4 7 // (n, k)
6 13 // (k, value) - 1๋ฒ์งธ ๋ฌผ๊ฑด์ ์ ๋ณด
4 8 // 2๋ฒ์งธ
3 6 // 3
5 12 // 4
*/
class Program
{
static void Main()
{
{
var sw = new StreamWriter(Console.OpenStandardOutput());
//int T = Convert.ToInt32(Console.ReadLine());
int[] inputArr = Array.ConvertAll(Console.ReadLine().Split(" "), Convert.ToInt32);
int n = inputArr[0];
int k = inputArr[1];
var objs = new (int k , int v)[n+1]; // ํํ๋ก ๋ฌผ๊ฑด์ ๋ฌด๊ฒ,๊ฐ์น ์ ์ฅ
int[,] dp = new int[n + 1, k + 1];
for (int i = 1; i <= n; i++)
{
int[] obj = Array.ConvertAll(Console.ReadLine().Split(" "), Convert.ToInt32);
objs[i].k = obj[0];
objs[i].v = obj[1];
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= k; j++)
{
if (objs[i].k <= j) // dp[i,j] 1 ~ i ๋ฒ์งธ ๋ฌผ๊ฑด์ j์ดํ๋ก ๋ด์ ๋ ์ต๋์ ๊ฐ์น = dp[i,j]
{
dp[i, j] = Math.Max(dp[i - 1, j], dp[i - 1, j - objs[i].k] + objs[i].v);
// dp[i,j] =>
// ์ด์ ๋ฌผ๊ฑด๊น์ง ๊ฐ์น
// (์ด์ ๋ฌผ๊ฑด๊น์ง์ ๋ฌด๊ฒ + ํ์ฌ๋ฌผ๊ฑด์ ๋ฌด๊ฒ) ๊ฐ ๋ฐฐ๋ญ ์ค๋(j) ๋ณด๋ค ์์ ๋ ์ ๊ฐ์น
// ๋์ค ํฐ๊ฐ.
}
else
{
dp[i, j] = dp[i - 1, j];
}
}
}
sw.WriteLine($"{dp[n,k]}");
sw.Flush(); sw.Close();
}
}
}
DP
3. ๋ฐฐ๋ญ ๋ด๊ธฐ DP
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= k; j++)
{
if (objs[i].k <= j) // dp[i,j] 1 ~ i ๋ฒ์งธ ๋ฌผ๊ฑด์ j์ดํ๋ก ๋ด์ ๋ ์ต๋์ ๊ฐ์น = dp[i,j]
{
dp[i, j] = Math.Max(dp[i - 1, j], dp[i - 1, j - objs[i].k] + objs[i].v);
// dp[i,j] =>
// ์ด์ ๋ฌผ๊ฑด๊น์ง ๊ฐ์น
// (์ด์ ๋ฌผ๊ฑด๊น์ง์ ๋ฌด๊ฒ + ํ์ฌ๋ฌผ๊ฑด์ ๋ฌด๊ฒ) ๊ฐ ๋ฐฐ๋ญ ์ค๋(j) ๋ณด๋ค ์์ ๋ ์ ๊ฐ์น
// ๋์ค ํฐ๊ฐ.
}
else
{
dp[i, j] = dp[i - 1, j];
}
}
}
์ก๋ด, ์ผ๊ธฐ?
๋ฐฐ๋ญ๋ฌธ์ dp
๋๊ธ๋จ๊ธฐ๊ธฐ