728x90
문제 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
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() ),
k = Integer.parseInt( st.nextToken() );
int c[] = new int[n+1], i, j;
for( i = 1; i <= n; i++ )
c[i] = Integer.parseInt( br.readLine() );
br.close();
int dp[][] = new int[n+1][k+1];
dp[0][0] = 1;
for( i = 1; i <= n; i++ ) {
for( j = 0; j <= k; j++ ) {
dp[i][j] = dp[i-1][j];
if( c[i] <= j )
dp[i][j] += dp[i][j-c[i]];
}
}
System.out.println( dp[n][k] );
}
}
* 배낭( 냅색 ) 문제의 응용
( 백준 12865 - 평범한 배낭 hyunjiishailey.tistory.com/132 )
☞ n : 동전의 종류 가짓수
☞ k : 총 가치의 합
i번째 코인까지 사용하여 가치의 합이 j가 되는 경우의 수를 담을 2차원 int dp[ n+1 ][ k+1 ] 배열 생성 ( dp[0][0] = 1 )
dp[ i ][ j ]에서 i는 i번째 요소( c[ i ] )까지 포함한다는 뜻이고 d[ i ][ j ]는 가치의 합이 j가 되는 경우의 수를 말함
☞ c[ i ] : i번째 코인의 가치 ( k_i )
☞ dp[ i ][ j ] : i번째 코인까지 사용하여 j를 만들 수 있는 경우의 수
이중 루프를 돌며 c[ i ]와 j를 비교한다 ( 1 <= i <= n ) ( 0 <= j <= k )
c[ i ]가 j보다 크면 dp[ i ][ j ] 는 dp[ i-1 ][ j ] 와 같다
c[ i ]가 j보다 작거나 같으면 dp[ i ][ j ]는 dp[ i-1 ][ j ] + dp[ i ][ j-c[i] ] 이다
반응형
'코딩 문제 풀기 ( Algorithm problem solving ) > 백준 온라인 저지 ( BOJ )' 카테고리의 다른 글
[백준(Baekjoon)][자바(java)] 11049 : 행렬 곱셈 순서 / 동적 계획법 2 (0) | 2020.12.09 |
---|---|
[백준(Baekjoon)][자바(java)] 11066 : 파일 합치기 / 동적 계획법 2 (0) | 2020.12.09 |
[백준(Baekjoon)][자바(java)] 2143: 두 배열의 합 / 이분 탐색 (0) | 2020.12.07 |
[백준(Baekjoon)][자바(java)] 7453 : 합이 0인 네 정수 / 두 포인터 (0) | 2020.12.07 |
[백준(Baekjoon)][자바(java)] 1644 : 소수의 연속합 / 두 포인터 (0) | 2020.12.07 |