游艇租赁(车票选择)

编程入门 行业动态 更新时间:2024-10-06 01:39:51

<a href=https://www.elefans.com/category/jswz/34/1719147.html style=游艇租赁(车票选择)"/>

游艇租赁(车票选择)

package sort;

/**
 * 游艇租赁最少费用计算:A点-B点,中途有1,2,3,4,5,6个停靠站点;每两个站点有不同的收费,计算任意两个站点最优方案及计算金额
 * (1,2)-2¥,(1,3)-6¥,(1,4)-9¥,(1,5)-15¥,(1,6)-20¥
 * (2,3)-3¥,(2,4)-5¥,(2,5)-11¥,(2,6)-18¥
 * (3,4)-3¥,(3,5)-6¥,(6,6)-12¥
 * (4,5)-5¥,(4,6)-8¥
 * (5,6)-6¥
 * 思路:假设i点到j点会在k点停靠是最优解,将路程分为(i,i+1,i+2,...,k),(k,k+1,...,j),即可以分为子序列,不断的拆解子序列
 * 最终会计算i和j相差2个站点,i和j相差3个站点,i和j相差4个站点的最优解之和
 * 当i=j m[i][j]=0;
 * 当j=i+1 m[i][j]=r[i][j],r[i][j]是两个站点的票价
 * 当j>i+1 m[i][j]=min{m[i][k]+m[k][j],r[i][j]}(i-k-j的票价之和和,i-j的票价取最小值)
 * 定义二维数组:r[i][j]是各个站点之间票价,m[i][j]计算个点之间的最小费用,s[i][j]记录两点之间停靠的站点
 * @author fengbin
 */
public class MinMoney {
    
    //站点的个数
    public static int n=6;
    public static int ms=7;
    public static int[][] r=new int[ms][ms],m=new int[ms][ms],s=new int[ms][ms];
    
    static void rent() {
        int i,j,k,d;
        for (d = 3; d <=n; d++) { //将问题分为小规模d
            for (i= 0; i <=n-d+1; i++) {
                j=i+d-1;
                for (k= i+1; k<j; k++) {
                    int temp;
                    temp=m[i][k]+m[k][j];
                    if(temp<m[i][j]) {
                        m[i][j]=temp;
                        s[i][j]=k;
                    }
                }
            }
        }
    }
    /**
     * 打印最短路线
     * @param i
     * @param j
     */
    public static void print(int i,int j) {
        if(s[i][j]==0) {
            System.out.print("--"+j);
            return;
        }
        print(i,s[i][j]);
        print(s[i][j],j);
    }
    /**
     * 打印二维数组
     * @param arr
     */
    public static void printArr(int[][] arr) {
        for (int i = 0; i < arr.length; i++) {
            int[] temp = arr[i];
            for (int j = 0; j < temp.length; j++) {
                System.out.print(temp[j]+"\t");
            }
            System.out.println();
        }
    }
    public static void main(String[] args) {
        System.out.println("请输入站点的个数n:");
        System.out.println("请依次输入各站点之间的租金:");
        //代替一个个数字输入
        int[] in=new int[] {2,6,9,15,20,3,5,11,18,3,6,12,5,8,6};
        int index=0;
        for (int i = 1; i <n; i++) {
            for (int j = i+1; j <=n; j++) {
                r[i][j]=in[index];
                index++;
                m[i][j]=r[i][j];
                s[i][j]=0;
            }
        }
        //初始各个站点
        for (int i = 0; i < ms; i++) {
            for (int j = 0; j <ms; j++) {
                if(i==0 && j<ms) {
                    //设置6个点
                    m[i][j]=j;
                    s[i][j]=j;
                    r[i][j]=j;
                }
                if(j==0 && i<ms) {
                    //设置6个点
                    m[i][j]=i;
                    s[i][j]=i;
                    r[i][j]=i;
                }
            }
        }
        printArr(m);
        rent();
        System.out.println("s[i][j]记录两点之间停靠的站点:");
        printArr(s);
        System.out.println("花费的最少租金为:"+m[1][n]);
        System.out.println("花费最少租金经过的站点:");
        print(1,n);
    }
       
}
 

更多推荐

游艇租赁(车票选择)

本文发布于:2024-02-07 05:12:58,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1753581.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:游艇   车票

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!