<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
    數(shù)據(jù)加載中……

    整數(shù)劃分算法原理與實現(xiàn)

    本文為原創(chuàng),如需轉(zhuǎn)載,請注明作者和出處,謝謝!

        整數(shù)劃分問題是將一個正整數(shù)n拆成一組數(shù)連加并等于n的形式,且這組數(shù)中的最大加數(shù)不大于n。
        如6的整數(shù)劃分為
       
        6
        5 + 1
        4 + 2, 4 + 1 + 1
        3 + 3, 3 + 2 + 1, 3 + 1 + 1 + 1
        2 + 2 + 2, 2 + 2 + 1 + 1, 2 + 1 + 1 + 1 + 1
        1 + 1 + 1 + 1 + 1 + 1
       
        共11種。下面介紹一種通過遞歸方法得到一個正整數(shù)的劃分?jǐn)?shù)。
       
        遞歸函數(shù)的聲明為 int split(int n, int m);其中n為要劃分的正整數(shù),m是劃分中的最大加數(shù)(當(dāng)m > n時,最大加數(shù)為n),
        1 當(dāng)n = 1或m = 1時,split的值為1,可根據(jù)上例看出,只有一個劃分1 或 1 + 1 + 1 + 1 + 1 + 1
        可用程序表示為if(n == 1 || m == 1) return 1;
       
        2 下面看一看m 和 n的關(guān)系。它們有三種關(guān)系
        (1) m > n
        在整數(shù)劃分中實際上最大加數(shù)不能大于n,因此在這種情況可以等價為split(n, n);
        可用程序表示為if(m > n) return split(n, n);   
        (2) m = n
        這種情況可用遞歸表示為split(n, m - 1) + 1,從以上例子中可以看出,就是最大加
        數(shù)為6和小于6的劃分之和
        用程序表示為if(m == n) return (split(n, m - 1) + 1);
        (3) m < n
        這是最一般的情況,在劃分的大多數(shù)時都是這種情況。
        從上例可以看出,設(shè)m = 4,那split(6, 4)的值是最大加數(shù)小于4劃分?jǐn)?shù)和整數(shù)2的劃分?jǐn)?shù)的和。
        因此,split(n, m)可表示為split(n, m - 1) + split(n - m, m)
       
        根據(jù)以上描述,可得源程序如下:
      
    #include <stdio.h>

       
    int split(int n, int m)
       {
          
    if(n < 1 || m < 1return 0;
          
    if(n == 1 || m == 1return 1;
          
    if(n < m) return split(n, n);
          
    if(n == m) return (split(n, m - 1+ 1);
          
    if(n > m) return (split(n, m - 1+ split((n - m), m));
      }

    int main()
    {
         printf(
    "12的劃分?jǐn)?shù): %d", split(1212));
        
    return 0;
    }

    將正整數(shù)劃分成連續(xù)的正整數(shù)之和
    如15可以劃分成4種連續(xù)整數(shù)相加的形式:
    15
    7 8
    4 5 6
    1 2 3 4 5

        首先考慮一般的形式,設(shè)n為被劃分的正整數(shù),x為劃分后最小的整數(shù),如果n有一種劃分,那么
    結(jié)果就是x,如果有兩種劃分,就是x和x x + 1, 如果有m種劃分,就是 x 、x x + 1 、 x x + 1 x + 2 、... 、x x + 1 x + 2 ... x + m - 1
    將每一個結(jié)果相加得到一個公式(i * x + i * (i - 1) / 2) = n,i為當(dāng)前劃分后相加的正整數(shù)個數(shù)。
    滿足條件的劃分就是使x為正整數(shù)的所有情況。
    如上例,當(dāng)i = 1時,即劃分成一個正整數(shù)時,x = 15, 當(dāng)i = 2時, x = 7。
    當(dāng)x = 3時,x = 4, 當(dāng)x = 4時,4/9,不是正整數(shù),因此,15不可能劃分成4個正整數(shù)相加。
    當(dāng)x = 5時,x = 1。

        這里還有一個問題,這個i的最大值是多少?不過有一點可以肯定,它一定比n小。我們可以做一個假設(shè),
    假設(shè)n可以拆成最小值為1的劃分,如上例中的1 2 3 4 5。這是n的最大數(shù)目的劃分。如果不滿足這個假設(shè),
    那么 i 一定比這個劃分中的正整數(shù)個數(shù)小。因此可以得到這樣一個公式i * (i + 1) / 2 <= n,即當(dāng)i滿足
    這個公式時n才可能被劃分。

    綜合上述,源程序如下
    int split1(int n)
    {
        
    int i, j, m = 0, x, t1, t2;
       
    // 在這里i + 1之所以變?yōu)閕 - 1,是因為i * (i - 1) / 2這個式子在下面多次用到,
      
    // 為了避免重復(fù)計算,因此將這個值計算完后保存在t1中。并且將<= 號變?yōu)榱?lt;號。
        for(i = 1; (t1 = i * (i - 1/ 2< n; i++
        {
            t2 
    = (n - t1);
            x 
    =  t2 / i;
            
    if(x <= 0break;
            
    if((n - t1) % i == 0)
            {
                printf(
    "%d ", x);
                
    for(j = 1; j < i; j++)
                    printf(
    "%d ", x + j);
                printf(
    "\n");
                m
    ++;
            }
        }
        
    return m;
    }




    Android開發(fā)完全講義(第2版)(本書版權(quán)已輸出到臺灣)

    http://product.dangdang.com/product.aspx?product_id=22741502



    Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


    新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

    posted on 2008-05-11 15:41 銀河使者 閱讀(2032) 評論(0)  編輯  收藏 所屬分類: algorithm 、C/C++ 原創(chuàng)

    主站蜘蛛池模板: 国产乱弄免费视频| 日本一区二区三区在线视频观看免费 | 国产婷婷综合丁香亚洲欧洲| 亚洲一区二区三区在线视频 | 亚洲色图.com| 亚洲人成人一区二区三区| 国产国产成年年人免费看片| 精品亚洲一区二区三区在线播放| 最近2019中文字幕免费看最新| 一级毛片成人免费看免费不卡| 亚洲人成电影在线天堂| 亚洲国产精品激情在线观看| 色吊丝最新永久免费观看网站| 日本人的色道免费网站| 无码人妻精品中文字幕免费| 三年在线观看免费观看完整版中文| 美女免费精品高清毛片在线视| 亚洲日韩AV一区二区三区中文| 亚洲一级毛片中文字幕| 亚洲国产模特在线播放| 亚洲Aⅴ无码一区二区二三区软件| 野花高清在线电影观看免费视频| 亚洲视频免费在线看| 久久久久久国产精品免费免费男同 | 亚洲欧美国产国产综合一区| 中文字幕在线观看亚洲视频| 亚洲欧洲日产国码二区首页 | 亚洲欧美第一成人网站7777| 最新亚洲卡一卡二卡三新区| 亚洲乱码中文字幕小综合| 亚洲国产美女在线观看| 亚洲国产综合精品| 亚洲免费在线视频观看| 亚洲人成在线播放| 亚洲综合校园春色| 亚洲精品V天堂中文字幕| 亚洲风情亚Aⅴ在线发布| 国产精品久久亚洲一区二区| 美女被爆羞羞网站免费| 无遮挡免费一区二区三区| 精品无码一级毛片免费视频观看 |