ダイナミックプランニング法コインのお釣りを解く(Java)
アルゴリズムの説明:
動的計画アルゴリズムは、通常、ある最適な性質を有する問題を解くために使用される.このような問題では,実行可能な解がたくさんあるかもしれない.各解は1つの値に対応し,最適値を持つ解を見つけたい.基本思想も,解くべき問題をいくつかのサブ問題に分解し,まずサブ問題を解き,サブ問題の結果を保存し,これらのサブ問題の解から元の問題の解を得る.動的計画は実質的に空間で時間を変える技術であり、実現過程で発生過程の様々な状態を記憶しなければならないため、その空間複雑度は他のアルゴリズムより大きい.
問題の説明:
V 1、V 2、V 3...単位の硬貨の山に現存していますが、少なくともT単位の小銭を見つけるには何個の硬貨が必要ですか?
問題解決の考え方:
1,Tに最も近い硬貨Vを見つけ出す
2,f(T)問題の解をf(T-V)+1問題の解に変換して再帰する
コード実装:
CoinChangeクラスは、コインのお釣りを処理するためのビジネスです.
動的計画アルゴリズムは、通常、ある最適な性質を有する問題を解くために使用される.このような問題では,実行可能な解がたくさんあるかもしれない.各解は1つの値に対応し,最適値を持つ解を見つけたい.基本思想も,解くべき問題をいくつかのサブ問題に分解し,まずサブ問題を解き,サブ問題の結果を保存し,これらのサブ問題の解から元の問題の解を得る.動的計画は実質的に空間で時間を変える技術であり、実現過程で発生過程の様々な状態を記憶しなければならないため、その空間複雑度は他のアルゴリズムより大きい.
問題の説明:
V 1、V 2、V 3...単位の硬貨の山に現存していますが、少なくともT単位の小銭を見つけるには何個の硬貨が必要ですか?
問題解決の考え方:
1,Tに最も近い硬貨Vを見つけ出す
2,f(T)問題の解をf(T-V)+1問題の解に変換して再帰する
コード実装:
CoinChangeクラスは、コインのお釣りを処理するためのビジネスです.
public class CoinChange {
/**
*
* @param coinValue
* @param totalValue
* @return
*/
public int coinNum(int[] coinValue,int totalValue){
List<Integer> coins=new ArrayList<Integer>();
coins.add(0);
for(int i=1;i<=totalValue;i++){
int coin=nearestCoin(i,coinValue);
int coinNum=coins.get(i-coin)+1;
coins.add(coinNum);
}
return coins.get(totalValue);
}
/**
*
*/
private int nearestCoin(int value,int[] coinValues){
int res=0;
int nearest=Integer.MAX_VALUE;
for(int coinValue:coinValues){
if(coinValue<=value){
int distance=value-coinValue;
if(distance<nearest){
nearest=distance;
res=coinValue;
}
}
}
return res;
}
}
Mainクラスはテストに使用されます.public class Main {
public static void main(String[] args) {
CoinChange coinChange=new CoinChange();
int res=coinChange.coinNum(new int[]{1,2,3,5,11},81);
System.out.println(res);
}
}
印刷出力:9