動態規劃算法入門

package com.huawei.interview2;
/**
 * 動態規劃 
 * 入門級 題目:只有1元,3元,5元硬幣,如何用最少的硬幣湊夠11元。
 */
public class Test7 {


public static void main(String[] args) {
int coinsNum = getCoinsNum(10);
System.out.println(coinsNum);
// for (int i = 0; i < 12; i++) {
// int coinsNum = getCoinsNum(i);
// System.out.println(coinsNum);
// }
}


/**

* @param money
*            要用硬幣拼湊的錢數
* @return
*/
private static int getCoinsNum(int money) {
// 可用的硬幣只有1元,3元,5元
int[] coins = new int[] { 1, 3, 5 };


// min[n]表示湊夠n元所需的最少的硬幣數
int[] min = new int[money + 1];
// 易知初始值min[0] = 0
min[0] = 0;


// 從 1開始循環,不是從0開始
for (int i = 1; i <= money; i++) {
// 每次二重循環前,把min[i]置爲一個大值
min[i] = Integer.MAX_VALUE;
for (int j = 0; j < coins.length; j++) {
// coins[j] <= i保證所用硬幣面值小於i
// min[i - coins[j]] + 1 表示各種情況
if (coins[j] <= i && min[i - coins[j]] + 1 < min[i]) {
// 循環各種情況,找出最小的min[i]
min[i] = min[i - coins[j]] + 1;
}
}
}


return min[money];
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章