最近熟悉了下动态规划法,该方法是一种求解最优化问题的算法设计策略,原问题的最优值可以分解成子结构,且该子结构同样是最优的才成立。这种最优子结构,它与贪心法很相似,当然深入一下,就会发现有本质的区别,贪心法是以自顶向下的方式使用最优子结构的,贪心法会先做出选择没在当时看起来是最优的选择,然后是在求解一个结果的子问题。而动态规划法是自底向上的使用子结构,他是先寻找到子问题的最优解,然后是在做选择。同时在动态规划法中存储重复子问题,通俗的一个问题划分两个值问题,在就两个值问题的过程中,往下的值问题会可能存在重复的值问题。下面我写了个大面值找硬币的实现。
package dynamicplanforcoinchange;
/**
* @author leon(liangzou0318@gmail.com)
* @date 2012-11-22
* @filaname CoinsChangeimpl.java
*/
public class CoinsChangeimpl {
public static int makechanges(int money,int[] valuekinds){
int mincoins=money;
for(int i=0;i<valuekinds.length;i++){
if(money<valuekinds[i]){
continue;
}
else{
int temp=makechanges(money-valuekinds[i],valuekinds)+1;
if(mincoins>temp){
mincoins=temp;
}
}
}
return mincoins;
}
public static void main(String[] args) {
int[] valuekinds=new int[]{25,21,10,5,1};
int money=63;
int a=makechanges(money,valuekinds);
System.out.println(a);
}
}
运行结果是:3