Perfect Sqaures
Updated:
기본적인 동전 문제이다. 뭐 아니면 배낭문제라고 보셔도 무방하다.
여러개의 동전 중에 동전을 최소로 선택해서 목표치를 만드는 경우의 대표적인 문제이다.
이 문제는 배낭문제와는 좀 다르지만, 최소의 동전을 선택해서 목표인 n을 만드는문제이다.
dp[k] : k원을 만드는데 쓰이는 동전의 최소갯수라고 정의하면
만약 k원을 만드는데 a라는 동전이 쓰인다면 a라는 동전은 k보다 같거나 작을것이다.
그럼 a라는 동전을 사용했다면, dp[k-a]라는 수로 접근이 되고 그 상태에서 +1을 한것이랑 항상 비교를 해주면 된다.
dp[i] : min(dp[i], dp[i-arr[k]]+1)(단, i≥arr[k]여야 한다)
by Java
class Solution {
public int numSquares(int n) {
List<Integer> coin = new ArrayList<>();
for(int i=1;;i++) {
int p = i*i;
if(p<=n) coin.add(p);
else break;
}
int[] dp = new int[n+1];
Arrays.fill(dp,-1);
return go(n,dp,coin);
}
private int go(int k,int[] dp,List<Integer> list) {
if(k<0) return (int)1e9;
if(k==0) return 0;
if(dp[k]!=-1) return dp[k];
dp[k] = (int)1e9;
for(int i=list.size()-1;i>=0;i--) {
int cur =list.get(i);
if(k-cur>=0) {
dp[k] = Math.min(dp[k],go(k-cur,dp,list)+1);
}
}
return dp[k];
}
}
Leave a comment