安全性を証明するために[オファー](真実を伝えるために、または理解していない)ロープを切ります

タイトル:ここで、nはロープの長さであり、ロープは、セグメントMに切断してください(Mおよびnは整数であり、nは> 1およびM> 1)各ロープの長さをkと呼ばれている[0]、K [1 ]、···、K [m]は、K [0] * K [1] * ... * K [m]は、最大の可能な製品はどのくらいですか?例えば、ロープ8の長さは、我々は三つの部分、この時点で得られた生成物2,3,3の長さに、それを切断した場合、最大18です。

 

ダイナミックプログラミング

  常に問題を解決するために最小から始め、問題のストレージサブ最適解は、(一次元または二次元アレイ)ダウン解決されており、徐々に大きな問題を解決する結合の問題に対する次善のソリューション。

  動的なプログラミング機能:

  1. 対象問題は、最適解を求める問題である:対象問題は、セグメントの製品を見つけることであるロープの最大長さをカット
  2. 最適解は、各サブ問題以降の全体的な問題に対する最適解である:私ははさみの第1の位置では、ロープiは、NIに分割され、同じIおよびNiのための方法の最適化、それぞれ、セグメントに切断...以下のように...
  3. 4分は、2つの2を与えるための第2のブレードナイフ第4及び6に、第一ロープ10の長さとします問題は小さな問題の多数に分割され、重複するより小さなサブ問題との間の小さな問題があります;第三のブレード6分、2及び4は、その後持って...... F(2)問題の共通サブF(4)Fとは、(6)の
  4. 問題の下の分析に上から、下から上の問題を解決するために:部分問題の繰り返しを避けます

 

貪欲アルゴリズム

  各ステップは、あなたが最適解を得ることができ、この選択に基づいて、貪欲な選択をすることができます。

  ロープ10の長さは、例えば、残差が依然としてロープ3、切断部3の長さよりも大きい場合、ロープの長さは、切断部3の長さが3より大きい場合......ロープの残りの長さが3未満になるまで継続  

 

//ダイナミックプログラミング

  F(N)= MAX(F(I)* F(NI))、0 <iがnを<

    問題を回避するために(3)を(5)(4)、F、Fを得る(2)、F、Fを得るために、繰り返し......

  場合ロープ2の長さときに2つのだけはさみ1 ===> F(2)= 1。

  時ロープ3の長さは、セクション2、及び切断することができる、または三つのセグメントのセクション> 1 * 2> 1 * 1 * 1 ===> F 1 ===(3)= 2

{ソリューションクラス
パブリック:
    INT maxProductAfterCutting_solution(INT長さ){ 
        (長さ<2)IF 
        { 
            0を返す; 
        } 
        (長さ== 2)IF 
        { 
            リターン1; 
        } 
        IF(長さ== 3)
        { 
            リターン2; 
        } 
        
        //サブ製品アレイにおける最適解ストレージ問題
        INT * =製品新しい新しいINT [長さ+ 1]; 
        製品[0] = 0; 
        商品[1] = 1; 
        生成物[2] = 2; 
        商品= 3 [3]。
        //生成物[i]はロープの長さの最大セグメント長の積のi番目の要素は、I、F(I)のセグメントに切断された意味
        INT最大= 0。
        [J]各jについて// Iを求める前に、F(j)はアウト解決されている、その結果を製品に格納されている
        以下のために(INT 4 = I; Iは=長さ<; Iは++)
        { 
            //全ての可能なF(J)* F(IJを決定する ) と最大値と比較
            最大= 0; 
            。(INT のために1 = J; J = I / 2、J ++)
            { 
                int型TMP =商品[J] *商品[I - J]; 
                IF(MAX <TMP)
                { 
                    MSX = TMP; 
                } 
                商品[I] =マックス; 
            } 
        } 
        マックス=商品[長さ]。
        []製品を削除し、
        
        最大を返します; 
        
    } 
};

  

 

//貪欲アルゴリズム

  場合N> = 5、ロープ3の長さを切断する限り、場合ロープ4の残りの長さ、ロープの2つの長さは、ロープ2を切断

{ソリューションクラス
パブリック:
    INT maxProductAfterCutting_solution(INT長さ){ 
        (長さ<2)IF 
        { 
            戻り0; 
        } 
        (長さ== 2)IF 
        { 
            リターン1; 
        } 
        IF(長さ== 3)
        { 
            リターン2; 
        } 
        
        //作りますロープ部3の多くの切断長とり得る
        INT長= timesOf3 / 3と、
        
        ロープの長さは、最後の4残りとき//場合:*> 1 2 * 2は、長さ2のロープ2を切断3 
        IF((長さ- timesOf3 * 3)== 1)
        { 
            timesOf3 - = 1; 
        } 
        int型timesOf2 =(長さ- timesOf3 * 3)/ 2。
        
        //パワーyに戻すX。
        リターン((INT)(POW(3、timesOf3))*(INT)(POW(2、timesOf2))); 
    } 
};

  

 

おすすめ

転載: www.cnblogs.com/xiexinbei0318/p/11415465.html