算法初探-动态规划(Dynamic Programming)

本文探讨了硬币组合问题及数塔问题的算法解决方案。通过动态规划方法,解决了如何使用最少数量的1、3、5元硬币组合成11元的问题,并给出了一般化的解决思路。同时,介绍了数塔问题的状态转移方程及其求解过程。

编程之中接触到很多关于算法的知识,想来整理一番,算是对自己记忆的一个提醒


1.Coin11Problem  问题为:使用最少的三种面值为1,3,5的硬币组合出11元。


重要的是状态以及状态转移方程 d(i)=min{ d(i-vj)+1 },其中i-vj >=0,vj表示第j个硬币的面值;



package com.njit.dynamic_programming;

/**
 * 使用最少若干的1,3,5硬币,组合出11元
 *  
 * @author  邵鹏
 * @version  [V1.00, 2017年7月13日]
 * @see  [相关类/方法]
 * @since V1.00
 */
public class Coin11Problem
{
    public static void main(String[] args)
    {
        //状态以及状态转移方程
        //d(i)     d(i)=min{d(i-vj)+1}   vj为硬币的值
        int[] a ={1,3,5};
        int[] dp =new int[12];
        dp[0]=0;
        for(int i=1;i<=11;i++){
            dp[i]=i;
        }
        for(int i=1;i<=11;i++){
            for(int j=0;j<3;j++){
                if(i>=a[j] && dp[i-a[j]]+1<dp[i]){
                    dp[i]=dp[i-a[j]]+1;
                }
            }
        }
        System.out.println("最少需要"+dp[11]+"个硬币可以组成11");
//        System.out.println(a[0]+" "+a[1]+" "+a[2]);
        for(int i=1;i<=11;i++){
            System.out.print(dp[i]+" ");
        }
        
    }
    
    
    
}


以上为特定11元

以下为推广

package com.njit.dynamic_programming;

public class Coin11ProblemCommonVersion
{
    public static void main(String[] args)
    {
        //调用方法 在1 3 5 三个硬币中找出最少的组合方式 组成 sum 变量为输入的sum
        int inputCoin=11;
        int outputCoin= new Coin11ProblemCommonVersion().getMinCoin(inputCoin);
        System.out.println("当总数为 "+inputCoin+" 时,最少的硬币数为:"+outputCoin);
        
        int[] outputCoinArray =new Coin11ProblemCommonVersion().getMinCoinArray(inputCoin);
        System.out.println("当总数为 "+inputCoin+" 时,各硬币数为:");
        for(int i=1;i<=inputCoin;i++){
            System.out.println("dp["+i+"]="+outputCoinArray[i]);
        }
        
    }
    
    
    /** 
     * 根据输入,动态输出硬币数量
     * 
     * @param sum
     * @return
     * @see [类、类#方法、类#成员]
     */
    public int getMinCoin(int sum){
        int coin=0;
        int[] a ={1,3,5};
        int[] dp = new int[sum+1];
        dp[0]=0;
        for(int i=1;i<=sum;i++){
            dp[i]=i;
        }
        for(int i=1;i<=sum;i++){
            for(int j=0;j<3;j++){
                if(i>=a[j] && dp[i-a[j]]+1<dp[i] ){
                    dp[i]=dp[i-a[j]]+1;
                }
            }
        }
        
        return dp[sum];
    }
    
    /** 
     * 输入最后的硬币数,返回过程中的所有最小硬币数
     * <功能详细描述>
     * @param sum
     * @return
     * @see [类、类#方法、类#成员]
     */
    public int[] getMinCoinArray(int sum){
        int coin=0;
        int[] a ={1,3,5};
        int[] dp = new int[sum+1];
        dp[0]=0;
        for(int i=1;i<=sum;i++){
            dp[i]=i;
        }
        for(int i=1;i<=sum;i++){
            for(int j=0;j<3;j++){
                if(i>=a[j] && dp[i-a[j]]+1<dp[i] ){
                    dp[i]=dp[i-a[j]]+1;
                }
            }
        }
        return dp;
    }
    
}

2.MathTowerProblem (数塔问题:三角形结构,算出从下到上,数字总和最大的一条路径的和)

状态转移方程

f[i][j] = max(f[i+1][j], f[i+1][j+1]) + map[i][j]

        int[][] mathTower = new int[][]{{0,0,0,0,0,0},{0,7,0,0,0,0},{0,3,8,0,0,0},
            {0,8,1,0,0,0},{0,2,7,4,4,0},{0,4,5,2,6,5}};
        System.out.println("原始节点为:");
        for(int i=1;i<=5;i++){
            for(int j=1;j<=i;j++){
                System.out.print(mathTower[i][j]+" ");
            }
            System.out.println();
        }
        
        for(int i=5;i<=5;i--){
            for(int j=1;j<i;j++){
                mathTower[i-1][j]+=Math.max(mathTower[i][j], mathTower[i][j+1]);
            }
        }
        System.out.println("自底而上的最大数值路径得到的值为: "+mathTower[1][1]);
        for(int k=1;k<=5;k++){
            for(int t=1;t<=k;t++){
                System.out.print(" "+mathTower[k][t]);
            }
            System.out.println();
        }





【3D应力敏感度分析拓扑优化】【基于p-范数全局应力衡量的3D敏感度分析】基于伴随方法的有限元分析和p-范数应力敏感度分析(Matlab代码实现)内容概要:本文档介绍了基于伴随方法的有限元分析与p-范数全局应力衡量的3D应力敏感度分析,并结合拓扑优化技术,提供了完整的Matlab代码实现方案。该方法通过有限元建模计算结构在载荷作用下的应力分布,采用p-范数对全局应力进行有效聚合,避免传统方法中应力约束过多的问题,进而利用伴随法高效求解设计变量对应力的敏感度,为结构优化提供关键梯度信息。整个流程涵盖了从有限元分析、应力评估到敏感度计算的核心环节,适用于复杂三维结构的轻量化与高强度设计。; 适合人群:具备有限元分析基础、拓扑优化背景及Matlab编程能力的研究生、科研人员与工程技术人员,尤其适合从事结构设计、力学仿真与多学科优化的相关从业者; 使用场景及目标:①用于实现高精度三维结构的应力约束拓扑优化;②帮助理解伴随法在敏感度分析中的应用原理与编程实现;③服务于科研复现、论文写作与工程项目中的结构性能提升需求; 阅读建议:建议读者结合有限元理论与优化算法知识,逐步调试Matlab代码,重点关注伴随方程的构建与p-范数的数值处理技巧,以深入掌握方法本质并实现个性化拓展。
下载前必看:https://pan.quark.cn/s/9f13b242f4b9 Android 平板设备远程操控个人计算机的指南 Android 平板设备远程操控个人计算机的指南详细阐述了如何运用 Splashtop Remote 应用程序达成 Android 平板设备对个人计算机的远程操控。 该指南被划分为四个环节:首先,在个人计算机上获取并部署 Splashtop Remote 应用程序,并设定客户端密码;其次,在 Android 平板设备上获取并部署 Splashtop Remote 应用程序,并与之建立连接至个人计算机的通道;再次,在 Splashtop Remote 应用程序中识别已部署个人计算机端软件的设备;最后,运用平板设备对个人计算机实施远程操控。 关键点1:Splashtop Remote 应用程序的部署与配置* 在个人计算机上获取并部署 Splashtop Remote 应用程序,可通过官方网站或其他获取途径进行下载。 * 部署结束后,必须输入客户端密码,该密码在平板控制计算机时用作验证,密码长度至少为8个字符,且需包含字母与数字。 * 在配置选项中,能够设定是否在设备启动时自动运行客户端,以及进行互联网搜索设置。 关键点2:Splashtop Remote 应用程序的 Android 版本获取与部署* 在 Android 平板设备上获取并部署 Splashtop Remote 应用程序,可通过 Google Play Store 或其他获取途径进行下载。 * 部署结束后,必须输入客户端密码,该密码用于连接至个人计算机端软件。 关键点3:运用 Splashtop Remote 远程操控个人计算机* 在 Splashtop Remote 应用程序中识别...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值