zoukankan      html  css  js  c++  java
  • java实现动态规划算法

    动态规划算法:
    将待求解的问题分解为若干个子问题,按顺序求解子问题,前一子问题的解,为后一子问题的求解提供了有用的信息。
    在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。
    为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法。
    对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。
    不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。

    硬币找零:
    public class Test{

    public static void main(String[] args){

    int[] arr = {10,15,5,2,1}; //随机生成不同面额的硬币,并存入数组中
    int money = 63; // 生成需要找零的面额
    int[] need = new int[money + 1]; //生成最小找零数的存储数组

    zhaoling(arr,arr.length,money,need); //找零操作
    }

    public static void zhaoling(int[] arr, int n, int money, int[] need){

    need[0] = 0; //定义 当需要找零0元时, 最小找零数为0


    //从需要找一元硬币开始找零计算
    for(int i=1;i<money;i++){
    int minneed = i; // 定义默认最小找零数

    //找零查找
    for(int j=0;j<n;j++){
    if(arr[j]<=i){
    int count = need[i - arr[j]] + 1; //获得找零数
    if(count < minneed){ //判断该找零数与默认找零数比较
    minneed = count;
    }
    }
    }
    need[i] = minneed; //将需要找零i元时 所需要的找零数存入数组中
    }
    System.out.println("面值为"+(money)+"的最小找零硬币数为:"+need[money]);
    }
    }


    最长公共子序列:
    public class Test{

    public static void main(String[] args){

    //输入两个字符串
    String a = "abccbcd";
    String b = "bcbdc";

    //获得比较排序后的二维数组
    int[][] arr = bestLong(a,b);

    //输出最长公共子序列
    System.out.print("最长公共子序列为:");
    print(arr, a, b, a.length(), b.length());
    }

    public static int[][] bestLong(String a, String b){

    //定义一个二维数组
    int[][] max = new int[a.length()+1][b.length()+1];

    for(int i=0;i<a.length();i++){
    max[i][0] = 0;
    }

    for(int j=0;j<b.length();j++){
    max[0][j] = 0;
    }

    for(int i=1;i<a.length();i++){

    for(int j=1;j<b.length();j++){

    if(a.charAt(i-1) == b.charAt(j-1)){
    max[i][j] = max[i-1][j-1] + 1;
    }else if(max[i-1][j] >= max[i][j-1]){
    max[i][j] = max[i-1][j];
    }else{
    max[i][j] = max[i][j-1];
    }
    }
    }

    return max;

    }

    public static void print(int[][] arr, String a, String b, int i, int j){

    if(i==0 || j==0){
    return;
    }

    if(a.charAt(i - 1) == b.charAt(j - 1)) {
    print(arr, a, b, i - 1, j - 1);
    System.out.print(a.charAt(i - 1));
    }else if (arr[i - 1][j] >= arr[i][j]) {
    print(arr, a, b, i - 1, j);
    }else {
    print(arr, a, b, i, j - 1);
    }

    }

    }

  • 相关阅读:
    数组中的趣味题二
    数组中的趣味题一
    归并排序
    堆内存与栈内存
    c++中的继承和组合
    直接插入排序
    NYOJ 1067 Compress String(区间dp)
    C++ Primer 学习笔记与思考_7 void和void*指针的使用方法
    ucgui界面设计演示样例2
    手机无法连接电脑的手机助手
  • 原文地址:https://www.cnblogs.com/shuaiyongyong/p/7325981.html
Copyright © 2011-2022 走看看