`
lknh
  • 浏览: 26005 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

论坛开到的一个数字拆分算法,感觉不错

阅读更多
http://www.iteye.com/topic/963980#1983213
题目
将任一个数字进行拆解,例如:  
 
3 = 2+1 = 1+1+1 所以3有三種拆法  
4 = 3 + 1 = 2 + 2 = 2 + 1 + 1 = 1 + 1 + 1 + 1 共五種  
5 = 4 + 1 = 3 + 2 = 3 + 1 + 1 = 2 + 2 + 1 = 2 + 1 + 1 + 1 = 1 + 1 +1 +1 +1 共七种  
 
 
随便给一个数字,对其进行拆解,并打印可拆解情况和拆解结果数。 
动态规划思想:
这个可以用动态规划来做:
状态:dp[x][y]表示将x拆分成的最大值为y的方法总数。
过程:dp[x][y] = dp[x-y][1] + dp[x-y][2] + … +dp[x-y][y];
结果:result = dp[n][1] + dp[n][2] + dp[n][3] + … + dp[n][n];

递归思想:
就是走楼梯算法:
给定n阶楼梯,可以一次跨1阶、2阶……k阶(k<=n,问共有多少走法,并记录每种走法
递归公式:  f(n) = f(n-1) + f(n-2) + f(n-3)+……+f(n-k)   n>=1
private void climb(int n, int step,List<int> steps)
        {
            if (step > n)
                return;

            steps.Add(step);

            if (n == step)
            {
                //当剩余楼梯的阶数等于第一步所跨的阶数
                //则到达最后一阶楼梯,此时为其中一种走法

                //记录每次走法
                this.count++;
              print(steps);

            }
            else
            {
                //如果没有达到最后一层,则递归剩余楼梯的走法
                //此时,第一可跨最大阶数由允许所跨最大阶数和剩余楼梯阶数的较小值决定

                for (int i = 1; i <= stemp&& i <= n - step; i++)
                {
                    //递归剩余楼梯第一步的每种走法
                    climb(n - step, i);

                    //退出递归时,清除剩余楼梯的走法
                    //以记录新的走法
                     list.RemoveAt(list.Count - 1);
                }

            }

        }

测试结果 :n=5,step=5时,共有16种走法:
1 1 1 1 1
1 1 1 2
1 1 2 1
1 1 3
1 2 1 1
1 2 2
1 3 1
1 4
2 1 1 1
2 1 2
2 2 1
2 3
3 1 1
3 2
4 1
5

这是考虑顺序的,你上面的就更简单了,不考虑顺序,放进set对象里过滤一下就可以了
分享到:
评论

相关推荐

    基于单片机数字拆分的一种高效算法.pdf

    文档提到了一个特定的算法实现,即数字拆分函数。在C语言中,通过指针变量传递数组首地址,并通过形参地址+1来指向数组下一个元素,以此实现高效的数据处理。文章中还提到了实验验证,通过实际的硬件测试来验证算法...

    数码管多位数字拆分的方法

    然而,由于数码管每次只能显示一个数字,因此当我们需要显示多位数字时,就必须采取一定的方法将这些数字拆分成一个个独立的数字单元,并分别显示在不同的数码管上。本文将详细介绍如何实现这一拆分过程。 #### 一...

    基于订单拆分生产的MTO企业生产调度及算法研究.pdf

    本文研究基于订单拆分生产的MTO企业生产调度问题,并设计了一个二级调度方案,包括订单排产调度和工序调度。同时,建立了基于订单可拆分生产的订单排产调度模型,并使用基于非线性寻优的改进遗传算法对模型进行求解...

    整数拆分整数拆分整数拆分整数拆分整数拆分

    整数拆分是一个在数学和计算机科学中常见的问题,它涉及到组合数学和递归算法等领域。整数拆分指的是将一个正整数 n 分解成 k 个正整数的和,每个部分都是非负整数,并且这些部分的和等于 n。在描述这个问题时,我们...

    超额发票单据按照限额拆分java

    #### 一、超额发票单据按照限额拆分的基本概念 超额发票单据是指在发票管理过程中出现的一种特殊情况,即发票单据中的某项或某些项目金额超过预先设定的限额标准。为了符合财务规定及审计要求,这类单据需要被拆分...

    数字 转 金额 最快算法

    总结来说,"数字转金额最快算法"是一个专注于效率的程序设计问题,它涉及到数字与中文字符的映射、数量级转换以及特定情况的处理,如零的表示。通过有效的算法设计和优化技术,我们可以构建出一个在处理大量数字转换...

    一个字拆分成高低字节;;

    在编程和计算机科学中,"一个字拆分成高低字节"是处理二进制数据时常见的操作,尤其是在处理低级编程、嵌入式系统或特定的微控制器如西门子1200系列时。这个过程涉及到将一个字(通常为16位或32位的数据单元)分解为...

    拆分自然数的几种算法.doc

    **自然数的拆分**指的是任何一个大于1的自然数\( N \),都可以被表示为若干个自然数之和,并且存在多种不同的拆分方式。例如,数字5可以被拆分为: - \( 5 = 1 + 1 + 1 + 1 + 1 \) - \( 5 = 1 + 1 + 1 + 2 \) - \( ...

    数字拆分源代码非常好懂

    这是一个数字查分的代码源程序,初学者的天堂,非常好懂,里面有解释。

    论文研究-基于卷积神经网络的手写数字识别算法研究 .pdf

    手写数字识别作为图像识别领域的一个重要分支,近些年来随着深度学习技术的发展得到了广泛的关注。手写数字识别可以分为脱机和联机两种识别方式,其中脱机手写数字识别因处理的是静止的二维数字点阵图像,难度相对较...

    乘积最大的拆分.zip

    标题“乘积最大的拆分”涉及的是一个计算机算法问题,主要目标是从一组数字中找到一种拆分方式,使得这些数字相乘的结果最大。这通常在数据结构与算法的学习中出现,尤其是在解决数学优化问题时。这类问题可能出现在...

    算法参考资料单片机数字滤波算法研究-牛余朋

    首先,“单片机数字滤波算法研究”这个标题涉及到单片机技术和数字信号处理中的滤波算法。我们可以将这个主题拆分为以下几个知识点: 1. 单片机技术基础 - 单片机的定义:单片机是一种集成电路芯片,它把一个...

    数字证书查看、拆分和格式转换工具

    本文将深入探讨“数字证书查看、拆分和格式转换工具”这一主题,涉及的关键词包括“SSL”、“keystore”、“crt”和“key”。 首先,让我们了解SSL(Secure Sockets Layer)和它的升级版TLS(Transport Layer ...

    将一个整数S随机拆分为N个在min~max之间的整数.txt

    ### 知识点详解 ...通过上述分析,我们可以看到,该算法利用递归的思想,实现了对一个整数的随机拆分。这种方法不仅简洁高效,而且易于理解和实现。在实际应用中,可以根据不同的需求调整参数,以适应各种场景。

    将一个整数线性表拆分成奇数和偶数线性表

    标题 "将一个整数线性表拆分成奇数和偶数线性表" 涉及的核心知识点是数据结构中的线性表操作以及算法设计。线性表是一种基本的数据结构,它由有限个相同类型元素构成的有序序列,常见的实现方式有数组和链表。 在本...

    基于python数字图像可视化水印系统的设计与实现(LSB算法、DCT算法、随机间隔算法、区域校验位算法、图像降级算法)

    【作品名称】:数字图像可视化水印系统的设计与实现 (LSB算法、DCT算法、随机间隔算法、区域校验位算法、图像降级算法、...GUI使用的Tkinter,因为涉及多层窗口的嵌套,就没有对程序进行拆分,全部写到一个程序里面了

    算法设计与分析拆分代码

    这个代码是老师要用c++编写的,用于算法设计与分析课程中的拆分

    binarysplit:用JavaScript编写的简单二进制拆分算法

    `binarysplit`是一个JavaScript库,它提供了一个简单的二进制拆分算法,允许开发者高效地处理二进制数据流。这个工具特别适合那些需要在JavaScript环境中处理大量二进制数据的应用,例如在Web浏览器中进行文件操作或...

    基于Java的按位拆分快速排序并行算法.pdf

    本文主要讨论了一种基于Java的按位拆分快速排序并行算法。该算法通过将数据按照位拆分,结合Java的多线程对拆分的数据进行并行处理,解决了大数据量排序问题。实验结果表明,该算法具有很高的性能,且具有很好的并行...

    C经典算法之数字拆解

    数字拆解问题是一种经典的组合数学问题,其目标是求出一个正整数可以被拆分为多少种不同的正整数之和的方法数。例如,数字`3`可以拆分为`2 + 1`或`1 + 1 + 1`等不同组合,共有3种拆分方法。 #### 解决方案概述 为了...

Global site tag (gtag.js) - Google Analytics