动态规划法实现找零 java

        最近熟悉了下动态规划法,该方法是一种求解最优化问题的算法设计策略,原问题的最优值可以分解成子结构,且该子结构同样是最优的才成立。这种最优子结构,它与贪心法很相似,当然深入一下,就会发现有本质的区别,贪心法是以自顶向下的方式使用最优子结构的,贪心法会先做出选择没在当时看起来是最优的选择,然后是在求解一个结果的子问题。而动态规划法是自底向上的使用子结构,他是先寻找到子问题的最优解,然后是在做选择。同时在动态规划法中存储重复子问题,通俗的一个问题划分两个值问题,在就两个值问题的过程中,往下的值问题会可能存在重复的值问题。下面我写了个大面值找硬币的实现。

     

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值