개발새발 로그

Dynamic Programming(냅색 알고리즘-2) 본문

알고리즘

Dynamic Programming(냅색 알고리즘-2)

이즈흐 2023. 6. 7. 13:07

최대점수 구하기(냅색 알고리즘)


이번 정보올림피아드대회에서 좋은 성적을 내기 위하여 현수는 선생님이 주신 N개의 문제를 풀려고 합니다. 각 문제는 그것을 풀었을 때 얻는 점수와 푸는 데 걸리는 시간이 주어지게 됩니다. 제한시간 M안에 N개의 문제 중 최대점수를 얻을 수 있도록 해야 합니다. (해당문제는 해당시간이 걸리면 푸는 걸로 간주한다, 한 유형당 한개만 풀 수 있습니다.)


▣ 입력설명

첫 번째 줄에 문제의 개수N(1<=N<=20)과 제한 시간 M(10 <=M <=300)이 주어집니다. 

두 번째 줄부터 N줄에 걸쳐 문제를 풀었을 때의 점수와 푸는 데 걸리는 시간이 주어집니다.

▣ 출력설명

첫 번째 줄에 제한 시간안에 얻을 수 있는 최대 점수를 출력합니다.


▣ 입력예제 1 

5 20
10 5
25 12
15 8
6 3
7 4


▣ 출력예제 1

41

 

이전 포스팅에서 다룬 문제와 비슷하지만 다른 방식으로 풀어야 한다.

 

먼저 제한시간dy배열의 크기로 선언합니다.

dy는 0으로 초기화해야 합니다. -> 최대점수를 구할 것이므로

dy [i]의 값은 해당 시간에 얻을 수 있는 최대 점수를 넣으면 됩니다.

이때 0부터 시작하는 게 아닌 제한시간 20분부터 시작해야 합니다.

->동전교환처럼 앞에서부터 시작하면 중복이 되어버린다.

->만약 5분부터는 0분에서 10점을 더한 값을 넣는다고 할 때  10분에 왔을 때는 5분에 10점 값이 있으므로  10+10이 돼버린다.

만약 1번 문제를 풀었다면 dy [20분]에는 dy[20분 - 5분]+점수 값을 넣으면 됩니다.

즉 dy [15분] 값에서 5분짜리 문제 점수를 더하는 것이다.

이렇게 문제를 계속 푼다는 가정을 하면서 누적해 나가면 됩니다.

 

먼저 1번 문제를 풀었을 때 가능한 최대점수를 넣어보자.

이제 2번 문제를 풀었을 때 가능한 최대점수를 넣어보자.

이제 3번 문제를 풀었을 때 가능한 최대점수를 넣어보자.

이제 4번 문제를 풀었을 때 가능한 최대점수를 넣어보자.

이제 5번 문제를 풀었을 때 가능한 최대 점수를 넣어보자.

이렇게 dy[20]의 값이 최종적으로 정답이된다.

 

코드로 바꿔보자.

 

let arr=[[10,5],[25,12],[15,8],[6,3],[7,4]];
let N= 20;
let dy=Array(N+1).fill(0);

for(let [num,time] of arr){
	for(let i=N;i>=0;i--){
    	dy[i]=Math.max(dy[i-time]+num,dy[i])
    }
}
console.log(dy[N]);
728x90
반응형
LIST