原题链接:
零钱兑换
完成情况:
一开始错误
原因
/*解题思路:1.先sort一下coins确保硬币面值是从小到大排序的2.从最大面额的硬币开始,到最小面额的硬币来结束程序 -> for()3.每次面额从1开始,往最多可以选择的能力去++这会导致一个很大的问题,那就是原本可以找的开的零钱,会因为你上述的操作,导致根本找不开,因为不存在最低基本单位1*/
解题思路:
参考代码:
__322 零钱兑换__错误思路
package 西湖算法题解___中等题; import java. util. Arrays ; public class __322 零钱兑换__错误思路 { public static void main ( String [ ] args) { int coins[ ] = { 186 , 419 , 83 , 408 } ; int amount = 6249 ; System . out. println ( coinChange ( coins, amount) ) ; } public static int coinChange ( int [ ] coins, int amount) { Arrays . sort ( coins) ; int useNums = 0 ; if ( amount== 0 ) { return 0 ; } int coins_length = coins. length - 1 ; for ( int i= coins_length; i>= 0 ; i-- ) { for ( int j= 1 ; j<= amount/ coins[ i] + 1 ; j++ ) { if ( amount - coins[ i] * j > 0 ) { useNums++ ; } else if ( amount - coins[ i] * j == 0 ) { useNums++ ; return useNums; } else { amount-= ( coins[ i] * ( j- 1 ) ) ; break ; } } } return - 1 ; }
}
还得是dp去做
package 西湖算法题解___中等题; import java. util. Arrays ; public class __322零钱兑换__动态递归 { public int coinChange ( int [ ] coins, int amount) { int max = amount + 1 ; int dp_coins [ ] = new int [ amount + 1 ] ; Arrays . fill ( dp_coins, max) ; dp_coins[ 0 ] = 0 ; for ( int i= 1 ; i<= amount; i++ ) { for ( int j= 0 ; i< coins. length; j++ ) { if ( coins[ j] <= i) { dp_coins[ i] = Math . min ( dp_coins[ i] , dp_coins[ i - coins[ j] ] + 1 ) ; } } } return dp_coins[ amount] > amount ? - 1 : dp_coins[ amount] ; }
}