将任一个数字进行拆解

题目 
将任一个数字进行拆解,例如:   
  
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 <= step&& i <= n - step; i++) 
                { 
                    //递归剩余楼梯第一步的每种走法 
                    climb(n - step, i); 

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

            } 

        } 

测试结果 :n=5,,climb(5,1)+climb(5,2)+climb(5,3)+climb(5.4)+climb(5,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 


这是考虑顺序的,你上面的就更简单了,不考虑顺序,放进set对象里过滤一下就可以了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值