https://www.acmicpc.net/problem/2293
2293번: 동전 1
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다.
www.acmicpc.net
백준 동전1문제 오답노트를 해야겠네요. dp 유명한공식문제라 기억해야하겠습니다.
package test01;
import java.util.*;
import java.lang.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int k=scan.nextInt();
int coin[]=new int[n];
for(int i=0;i<n;i++) {
int tmp=scan.nextInt();
coin[i]=tmp;
}
int dp[]=new int[k+1];
//1~10dp
//초기값
dp[0]=1;
for(int i=0;i<n;i++) {
//1,2,5 coin
for(int j=coin[i];j<=k;j++) {
dp[j]=dp[j]+dp[j-coin[i]];
}
}
System.out.println(dp[k]);
}
}
오답노트:
동전 coin = 1,2,5
for(int i=0;i<n;i++)
{
int tmp=scan.nextInt();
coin[i]=tmp;
}
경우의 수 저장할 공간
int dp[]=new int[k+1];
초기값 설정 및 경우의수 누적합
dp[0]=1;
for(int i=0;i<n;i++) {
//1,2,5 coin
for(int j=coin[i];j<=k;j++) {
dp[j]=dp[j]+dp[j-coin[i]];
}
}
먼저 i=0인경우 coin[0]니까 1 원이겠죠
그렇다면 dp에는
dp[j]=dp[j]+dp[j-coin[i]];
dp[현재누적값 j ]=dp[과거누적값 j]+ dp[ 현재 j - 현재 코인의 값 ]
1 원의 누적데이터
그림을 보시면 1원의 1원이 되기 위한 경우의수 1이죠 나머지 마찬가지로 10원까지 전부 1일겁니다.
i=1인경우coin[1]니까 2 원이겠죠
그렇다면 dp는 마찬가지로 계산하면
dp[j]=dp[j]+dp[j-coin[i]];
계산 먼저 하면 dp[2]=dp[2]+dp[ 2-2 ]; =>dp[2]=dp[2]+dp[0] => 2=1+1; 가 되겠죠
왜냐히먄 2가 되는 경우의수는 기존의 1coin의 경우의수 1가지, 그리고 2가 되는 한가지겠죠
이런식으로 증가하겠죠
다음은
i=2인경우 coin[2]니까 5 원이겠죠
기발한 아이디어 라고할까요 저는 노력하는 범재라 이런생각까지 오는게 정말 쉽지않네요.. ㅠㅠ 내공이 부족하다고 여러번 느끼네요
'알고리즘 공부' 카테고리의 다른 글
백준 암호 만들기(복습) (0) | 2023.11.15 |
---|---|
백준 동전2(복습) (1) | 2023.11.15 |
백준 LCS 3 (0) | 2023.11.09 |
백준 LCS 2 (0) | 2023.11.09 |
백준 보물섬(복습) (0) | 2023.11.09 |