๐ ๋ฌธ์
https://www.acmicpc.net/problem/14728
๋ฌธ์
ChAOS(Chung-ang Algorithm Organization and Study) ํ์ฅ์ด ๋์ด ์ผ์ด ๋ง์์ง ์ค์์ด๋ ์ํ๊ธฐ๊ฐ์๋ ์ผ ๋๋ฌธ์ ๊ณต๋ถ๋ฅผ ํ์ง ๋ชปํ๋ค๊ฐ ์ํ ์ ๋ ์ด ๋์ด๋ฒ๋ฆฌ๊ณ ๋ง์๋ค. ๋คํํ๋ ์น์ ํ์ ๊ต์๋๊ป์ ์๋์ ๊ฐ์ ํํธ๋ฅผ ์ํ ์ ์ ๊ณต์งํด ์ฃผ์ จ๋ค. ๋ด์ฉ์ ์๋์ ๊ฐ๋ค.
- ์ฌ๋ฌ ๋จ์์ ์ตํฉํ ๋ฌธ์ ๋ ์ถ์ ํ์ง ์๋๋ค.
- ํ ๋จ์์ ํ ๋ฌธ์ ๋ฅผ ์ถ์ ํ๋ค. ๋จ, ๊ทธ ๋จ์์ ๋ชจ๋ ๋ด์ฉ์ ์๊ณ ์์ด์ผ ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ๋ผ ๊ฒ์ด๋ค.
์ด๋ฐ ๋๊ฐ์ง ํํธ์ ํจ๊ป ๊ฐ ๋จ์ ๋ณ ๋ฐฐ์ ์ ์ ์ด ๋์ผ์ จ๋ค. ์ด๋ค ๋จ์์ ๋ฌธ์ ๋ฅผ ๋ง์ถ๊ธฐ ์ํด์๋ ๊ทธ ๋จ์์ ์์ ๊ณต๋ถ ์๊ฐ๋งํผ, ํน์ ๊ทธ๋ณด๋ค ๋ ๋ง์ด ๊ณต๋ถํ๋ฉด ๋ง์ถ ์ ์๋ค๊ณ ๊ฐ์ ํ์. ์ด๋, ChAOS ํ์ฅ ์ผ๋ก ์ธํด ํ๋ ์ค์์ด๋ฅผ ์ํ์ฌ ๋จ์ ์๊ฐ ๋์ ๊ณต๋ถํด์ ์ป์ ์ ์๋ ์ต๋ ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด ์ฃผ๋๋ก ํ์.
์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ์ด๋ฒ ์ํ์ ๋จ์ ๊ฐ์ N(1 ≤ N ≤ 100)๊ณผ ์ํ๊น์ง ๊ณต๋ถ ํ ์ ์๋ ์ด ์๊ฐ T(1 ≤ T ≤ 10000)๊ฐ ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค.
๋์งธ ์ค๋ถํฐ N ์ค์ ๊ฑธ์ณ์ ๊ฐ ๋จ์ ๋ณ ์์ ๊ณต๋ถ ์๊ฐ K(1 ≤ K ≤ 1000)์ ๊ทธ ๋จ์ ๋ฌธ์ ์ ๋ฐฐ์ S(1 ≤ S ≤ 1000)๊ฐ ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ค์์ด๊ฐ ์ป์ ์ ์๋ ์ต๋ ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
โ๏ธ ํ์ด
์ ํ์ ์ธ Knapsack(๋ ์)๋ฌธ์ ์ด๋ค.
์ฌ์ค ๋ ๋ฐฐ๋ญ ๋ฌธ์ ๋ ํธ๋ ๋น์์๋ ์ด์ฐ์ด์ฐ ๊ทธ๋ ๊ตฌ๋ ๋ฉ๋ํ๊ณ ๋์ด๊ฐ๋๋ฐ, ๋จธ๋ฆฌ์ ์๋ฒฝํ ๋ น์๋ค์ง๋ ์์์ ๋ค์ ํ ๋๊ฐ ๋๋ฉด ์๋ก์ด ์ ํ์ ๋ณด๋ฏ์ด ๋ฏ์ค๋ค (ใ ใ )
์๋ฎฌ๋ ์ด์ ๊ฐ์๊ฑด ์ ์ ์ํ๊ณ ํธ๋๋ฐ ์ด์ํ๊ฒ ๊ผญ ๋ชป ํธ๋ ๋ฌธ์ ๋ค์ด ์๋ค. 80%์ ํ๋ฅ ๋ก DP ๋ฌธ์ ์ด๋ค.
2์ฐจ์์ผ๋ก ํธ๋ ์ด ํ์์ ํ ํ๋ฆฟ์ฒ๋ผ ์ธ์๋ฌ์ ๊ทธ๋๋ก ์ ์ฉํ๊ณ , ๋ฌธ์ ์์ด ์ ํ๋ ธ๋ค.
๋ ์ ๋ฌธ์ ๋ฅผ ํ๋ ค๋ฉด ์๋ ์์ค์ฝ๋ ์ ํ์ ๊ทธ๋๋ก ์ธ์ฐ๋ ๊ฒ์ด ์ข๋ค!
๐ป ์์ค์ฝ๋: ์๋ฐ(Java)
/** knapsack */
public class Main_๋ฐฑ์ค_14728_๋ฒผ๋ฝ์น๊ธฐ_๊ณจ๋V {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int T = Integer.parseInt(st.nextToken());
int[][] section = new int[N+1][2];
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
int expectTime = Integer.parseInt(st.nextToken());
int score = Integer.parseInt(st.nextToken());
section[i][0] = expectTime;
section[i][1] = score;
}//input
int[][] dp = new int[N+1][T+1];//1~T๊น์ง
for (int i = 1; i <= N; i++) {//๊ณผ๋ชฉ๋ณ
int t = section[i][0];
int score = section[i][1];
for (int j = 1; j <= T; j++) {
if(j>=t) {
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-t]+score);
}else {
dp[i][j] = dp[i-1][j];
}
}
}
System.out.println(dp[N][T]);
}//end of main
}//end of class
๐ ๐ ๐
๏ผฐ๏ฝ๏ฝ๏ฝ๏ฝ ๏ฝ ๏ผข๏ฝ ๏ผณ๏ผก๏ผน
๐๐ฉ๐ข๐ฏ๐ฌ๐ด ๐ง๐ฐ๐ณ ๐ณ๐ฆ๐ข๐ฅ๐ช๐ฏ๐จ