class Solution {
public int coinChange(int[] coins, int amount) {
if(amount==0)return 0;
int[] dp = new int[amount+1];
Arrays.fill(dp, amount+1);
dp[0]=0;
for(int coin: coins){
if(amount>=coin){
dp[coin]=1;
}
}
for(int i=1; i<=amount; i++){
for(int coin: coins){
if(i>=coin){
dp[i]=Math.min(dp[i-coin]+1, dp[i]);
}
}
}
if (dp[amount]>amount){
return -1;
}else{
return dp[amount];
}
}
}
dp[i] = 금액 i를 만드는 최소 동전 개수amount+1로 초기화불필요한 코드
// ✘ 중복 처리
for(int coin: coins){
if(amount>=coin){
dp[coin]=1;
}
}
이후 메인 루프에서 자동으로 처리된다.
class Solution {
public int coinChange(int[] coins, int amount) {
int[] dp = new int[amount+1];
Arrays.fill(dp, amount+1);
dp[0] = 0;
for(int i=1; i<=amount; i++){
for(int coin: coins){
if(i >= coin){
dp[i] = Math.min(dp[i], dp[i-coin] + 1);
}
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
}
점화식:
dp[i] = min(dp[i-coin] + 1) for all coins
예시: coins=[1,2,5], amount=11
dp[11] = min(
dp[10] + 1, // 동전 1 사용
dp[9] + 1, // 동전 2 사용
dp[6] + 1 // 동전 5 사용
)
#LeetCode #DP #CoinChange #UnboundedKnapsack #Java