inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

2주만에 통과하는 알고리즘 코딩테스트 (2024년)

기억 ( 탑다운 DP, 메모이제이션 )

혹시 냅색문제의 경우 dp를 1차원으로 해결 할 수 있는 방법은 없을까요?

376

Tommy
0

public class BOJ_12865 { static int N; static int K; static int[][] merchandise; // 0 : 무게, 1 : 가치 static int[][] dp; public static void main(String[] args) { Scanner sc = new Scanner(System.in); N = sc.nextInt(); K = sc.nextInt(); merchandise = new int[N][2]; dp = new int[10000000][N]; for (int i = 0; i < 10000000; i++) { for (int j = 0; j < N; j++) { dp[i][j] = -1; } } for (int i = 0; i < N; i++) { merchandise[i][0] = sc.nextInt(); merchandise[i][1] = sc.nextInt(); } int max = recursion(0, 0); System.out.println(max); } private static int recursion(int index, int weight) { if (weight > K) { return Integer.MIN_VALUE; } if (index == N) { return 0; } if (dp[weight][index] != -1) { return dp[weight][index]; } dp[weight][index] = Math.max(recursion(index + 1, weight), recursion(index + 1, weight + merchandise[index][0]) + merchandise[index][1]); return dp[weight][index]; }안녕하세요 덕분에 강의 잘 듣고 있는 수강생입니다. 냅색 문제를 풀고 있는데, 최대 가능한 무게의 경우 100 (배낭 물품의 최대 개수) * 100,000(각 물건의 최대 무게) 로 생각보다 생성해줘야하는 배열의 크기가 크더라구요. 그래서 혹시 dp를 1차원 배열로 생성하면 어떻게 되는 지 궁금하여 1차원 배열로 해본 결과, 무게를 고려하지 않고 dp의 무게 갱신을 하게 되어 답이랑은 다르게 나오네요. 혹시 1차원 배열을 시도하려고 할 때 제가 놓치고 있는 부분이 있을까요?감사합니다.

코딩-테스트 알고리즘 java

답변 1

0

코딩 센세

늦게 답해 드려 죄송합니다! 1차원 냅색도 가능합니다! 🙂

 

너무너무 좋은 질문입니닷!!!

 

연산량은 변하지 않지만,

2차원 dp[i][j]를 구할때 i-1 j-1을 구하는 로직이니까

dp[x]에다가 무게로 얻을 수 있는 최대 가치를 정해두고

dp[x]를 x가 큰것부터 작은 것까지 위에서 아래 순서로 보면서 dp[x]랑 dp[x-?]를 채워주면 똑같은 로직으로 문제가 풀이됩니다!

 

ㅎㅎㅎ 시간 나실 때 도전해보시고 이런 로직에 대한 고찰이 즐거우시다면 앳코더나 코드포스 같은 대회도 한번씩 참가해보시는걸 추천드립니다!

학습법

0

36

1

정처기2회실기를 마치고.

0

72

0

코테 관련 질문

0

58

2

코테 준비 방법 문의

0

57

1

공부 시작..

0

46

1

방산 SW 개발자가 되기 위한 조언을 부탁드립니다!

1

187

1

JAVA로 백엔드 프로젝트

0

107

1

고민이있습니다...!

0

160

1

26년1회 실기 합격할수 있을까??ㅠㅠ

0

199

1

백준 서비스 종료

0

315

1

재귀함수 코드를 작성하는 단계가 어렵습니다.

0

238

0

자바 실무 단계

0

333

2