经典算法分析与设计——最短加法链
来源:互联网 发布:linux ping命令 编辑:程序博客网 时间:2024/06/12 20:41
问题描述:
对一个整数序列a1, a2, ,… ,an,若对序列中的每个数ak ( 1< k n),总存在序列中的数ai和aj(1<i , jk),使得ak = ai + aj,则称该整数序列为加法链。(相加的两个数可以是同一个数)例如:
1 2 3 5
1 2 4 6 7
3 6 9 15
都是加法链。
问题:对给定的整数m,构造一个最短的加法链,使得a1 = 1,am = m
输入:整数m
输出:以 1 打头、以m结尾的加法链
算法分析:
- 先从最开始输入的数将其拆分为两个数先加,当两个数相同时只输出一个数即可(也就是对2求余为0),否则就输出一个整除2的数以及一个整除2的数再加1
- 取最小的一个数再进行第一步的拆分数操作,当拆到的数有1存在,运行终止
- 例如下图所示分别对12,和7进行分析:
代码实现(java):
package shortest_addition_chain;import java.util.Scanner;/** * 算法分析:最短加法链 * 问题描述: * 1:先从最开始输入的数将其拆分为两个数先加, * 当两个数相同时只输出一个数即可(也就是对2求余为0), * 否则就输出一个整除2的数以及一个整除2的数再加1 * 2:取最小的一个数再进行第一步的拆分数操作,当拆到的数有1存在,运行终止 * @author jodenhe (824923282@qq.com) * */public class Main {public static void main(String[] args) {@SuppressWarnings("resource")Scanner sc = new Scanner(System.in);System.out.println("输入m:");int m = sc.nextInt();String result = "" + m;if (m != 1 && m != 0) {while (m != 1) {if (m % 2 == 0) {result = m / 2 + " " + result;} else {result = m / 2 + " " + (m / 2 + 1) + " " + result;}m = m / 2;}}System.out.println(result);}}
阅读全文
0 0
- 经典算法分析与设计——最短加法链
- 【算法设计与分析】最短路径的算法
- 算法分析与设计课程设计-Dijkstra最短路径算法
- 算法设计与分析——使用dijkstra算法计算最短路径并且给出路径上的节点序列
- 经典算法——迪杰斯特拉(Dijkstra)最短路径
- 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
- 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
- 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
- 最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(C/C++)
- 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
- 最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(C/C++)
- 最短路径算法—Floyd(弗洛伊德)算法分析与实现(C/C++)
- 最短路径算法—SPFA(Shortest Path Faster Algorithm)算法分析与实现
- 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
- 最短路径算法—SPFA(Shortest Path Faster Algorithm)算法分析与实现(C/C++)
- 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
- 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
- 最短路径算法—Floyd-Warshall算法分析与实现
- bootstrap
- Unity 脚本生命周期
- 设计模式之原型模式(Prototype)
- ManualResetEvent(转)
- 欢迎使用CSDN-markdown编辑器
- 经典算法分析与设计——最短加法链
- Android中通过Socket直接与RILD进行通信
- java项目集合
- 什么是uuid以及uuid在java中的使用
- 输入子系统之events消息数据传递
- java 获取两颜色值的中间值
- 01背包的动态规划解法(史无前例的详细)
- HDU 1874 迪杰斯特拉
- Volatile和Synchronized关键字