高效的动态规划算法应用案例

1.前言:动态规划与分治算法类似,递归求解子问题,再组合子问题来求解。但动态规划在子问题有重叠的情况下有优势。动态规划算法用于求解最优化问题,所求解的问题需要满足最优子结构性质:问题最优解由相关子问题的最优解组合而成。

2.动态规划的两种实现方式:

    2.1 带备忘的自顶向下法

           所谓的带备忘,即保存每一个子问题的解,在下次用时直接取出而不需要重新计算,从而提高效率。

    2.2 自底向上法

          即任何子问题的求解,只依赖于规模更小的子子问题的求解。由于是从小到大的规模顺序求解,即在计算子问题时,它的所有依赖的更小的子问题已经求解且保存,不需重新计算,从而提高效率。

3.钢条切割最优化求解(算法导论上的)

问题描述:给定钢条长度n和一个价格表p,求切割方案,使得销售收益r最大。


价格表

长度i 1 2 3 4 5 6 7 8 9 10 价格p 1 5 8 9 10 17 17 20 24

30


建立数学模型:r(n)=max(p(i)+r(n-i));    其中i=1,2,...n

说明:我们将钢条从左边切割下长度为i的一段,只对右边剩下的n-i长度来继续进行切割。即原问题最优解只包含一个子问题解(右端剩余部分),而不是两个。

java代码如下:

package com.talkweb.test01;

import java.util.Arrays;

/**
 * 动态规划运用案例
 * 钢条切割
 * @author Administrator
 *
 */
public class DynamicProgram {

	
	public static void main(String[] args){
		int[] p={-1,1,5,8,9,10,17,17,20,24,30};//下标对应钢条长度,值对应收益,下标从1开始
		DynamicProgram dp=new DynamicProgram();
		
		//1.初始化r
		int[] r=new int[p.length];
		for(int i=0;i0){
			System.out.print(s[n]+" ");
			n=n-s[n];
		}
		System.out.println();
	}
}

4.商品折扣最优购买方案的优惠总额(只是简单的自顶向下实现,没有用到动态规划)

package com.talkweb.arithmetic;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 商品折扣最优购买方案
 * @author Administrator
 *
 */
public class GoodsDiscount {

	public static void main(String[] args){
		//1.折扣集合
		List zks=new ArrayList();
		zks.add(new ZheKou(0,"0",0,0));
		zks.add(new ZheKou(1,"折扣1",30,6));
		zks.add(new ZheKou(3,"折扣2",60,15));
		zks.add(new ZheKou(2,"折扣3",99,20));
		
		GoodsDiscount gd=new GoodsDiscount();
		double money=100;
		int[] s=new int[zks.size()];
		System.out.println("优惠总额:"+gd.fun(zks,money,0));
	}
	
	/**
	 * 递归计算最多优惠额
	 * @param zks商品折扣
	 * @param money余额
	 * @return最多优惠额
	 */
	public double fun(List zks,double money,double youhui){
		//1.若余额不足以购买任何折扣,则返回优惠额
		boolean flag=false;
		for(int i=1;izks.get(i).getPrice()){
				//计算购买1件第i种折扣优惠额
				max=maxValue(max,fun(zks,money-zks.get(i).getPrice()+zks.get(i).getYhPrice(),youhui+zks.get(i).getYhPrice()));
			}
		}
		//保存优惠额
		youhui=max;
		return youhui;
	}
	
	public double maxValue(double m,double y){
		return m>y?m:y;
	}
}










你可能感兴趣的:(数据结构与算法,递归区)