動的計画法の1-王と金

参照

https://juejin.im/post/5a29d52cf265da43333e4da7

一つの国は5金、金準備の異なるすべての金鉱を発見し、鉱業のニーズに関わる労働者の数が異なっています。採掘に関わる労働者の総数は10人です。各金鉱のいずれかのすべて掘る、掘るかどうかは、半分を掘り、それらの金の半分を送信することはできません。どのように金を掘るために必要な労働者を割り当てることができます。

、第三の金300の鉱山4必須;、3を必要と第二シート金200金、最初金500金鉱山は、5を必要な第四の金350金鉱を、3が必要人々;第五金鉱山の金400、5人を取ります。

大半は、金の一人一人の量がタップされるように、各オペレータの金含有量の金の割合は、労働者のニーズ、降順によると、ソートは、最大を選択することを考えるようになりました。しかし、今、私たちは固定数ではなく、人々の数が限られています。採掘を掘る以下前端を相殺することはできません人の背中につながる、最初に応えることが可能です。だからここでは、それぞれの場合、最適なソリューションで計算されます。

第五金の最大値を求めて分解するためによると、問題は、現在、金と掘ると最大の金鉱山の4の前に金の現在の金と誰も掘っを掘るません最初の4人の残りの部分を掘るしようとしています値。F(5)= MAX(F(4、N)、F(4、NP)+ G(5))。一部の人々は、最初の4つは、第五を追加することができるので、その後、確かにああ追加することを言うかもしれません。しかし、最初の4つの金の最大値は、4つの第五金鉱を組み合わせることが必ずしもすべて掘る、である、それは少数の労働者を使用することが可能であり、最初の4つの金の一部は掘るませんでした。リクエスト3つの金メダルで、4つの鉱山を求めているので、それは金鉱を発見することでした。

第一の方法は、リストされたすべての例、および1つの判断なので、最悪の効率を網羅あります。

第二の方法は、このような戻り、次に、N = 1になるまで、= 5、計算n = 4の計算Nなどの層を、見つけるために、式に従って、上記あります。nは、各計算は、n型金鉱が含まれる場合がある、n個の金鉱山を掘るために人々を送信することで、その変更の総数は、その手段を行われたので、この計算は、非常に面倒です再反復前の計算に。

int型の金[] = { 500200300350400 }。
int型の労働者[] = { 53435 }。
ボイド dgold(BOOL * diggold、int型のインデックス、INT PNUM)
{ 
    場合(インデックスは== 0 
    { 
        場合(PNUM> =労働者が[ 0 ])
        { 
            diggold [ 0 ] = 
        }
    } 
    
    { 
        BOOL TMP [ 5 ] = { }。
        memcpyの(TMP、diggold、5 * はsizeofBOOL )); 
        TMP [インデックス] = 
        dgold(TMP、索引 - 1 、PNUM)。
        ブール TMP1 [ 5 ] = { }。
        memcpyを(TMP1、diggold、5 * はsizeofBOOL ));
        もし(PNUM> = 研究者[インデックス])
        { 
            TMP1 [インデックス] =; 
        } 
        dgold(TMP1、索引 - 1、PNUM - 研究者[インデックス])。
        int型 tmpgold = 0 ;
        以下のためにINT iが= 0 ; I <=インデックスを、iが++ 
        { 
            場合(TMP [I])
            { 
                tmpgold + = ゴールド[I]。
            } 
        } 
        int型 tmpgold1 = 0 以下のためにINT iが= 0 ; I <=インデックスを、iが++ 
        { 
            場合(TMP1 [I])
            { 
                tmpgold1 + = ゴールド[I]。
            } 
        } 
        もし(tmpgold> tmpgold1)
        { 
            のmemcpy(diggold、TMP、5 * はsizeofBOOL ))。
        } 
        
        { 
            のmemcpy(diggold、TMP1、5 * はsizeofBOOL ))。
        } 
    } 
} 
int型のmain()
{ 
    ブール diggold [ 5 ] = { }。
    dgold(diggold、410 )。
    文字INCHAR; 
    cinを >> INCHAR。
}

これは、再帰的トラバーサルです。私たちは、2つがあり、金鉱山は、n個の席で最初のn個の金鉱山のケースを取りたい、他は最初のn個の金鉱山開発ではありません。順次再帰的2つの最大値を計算しました。再帰的な輸出は、最初の金鉱山です。

この質問は、他のソリューションがあるということですか?はい、それはある動的計画2 -最長共通サブシーケンス話すのは、我々はテーブルを見て

 

上記の式から誘導される、F(5)= MAX(F(4、N)、F(4、NP)+ G(5))のような最長共通サブ感触で、n番目の要求金鉱ことがわかっ最適解が含まれる現在の金に相当し、その後、N-1の前に金を探し、次に、この金鉱山の必要な数を削除する数は、10 Pである(pは現在の金ヒト必要があります)以前のデータに対応するデータ(n番目の金鉱山がカウントされない)マックス。得られたような以前のデータを使用することもできます。コードは以下の通りです

int型の金[] = { 500200300350400 }。
int型の労働者[] = { 53435 }。
int型のmain()
{ 
    // 私は金jが人々のです 
    自動optgold = 新しい int型 [ 10 * 5 )](;
    int型 maxgold = 0 ;
    int型マキシ= 0 ;
    int型 maxj = 0 ;
    にとってINT J = 0 ; J < 10 ; J ++ 
    { 
        ためINT iは= 0 ; I < 5 ; I ++ 
        { 
            場合(jは+ 1 < 研究者[I])
            { 
                場合(I - 1 < 0 
                {
                    (* optgold + J * 5 + I)= 0 ; 
                } 
                
                {
                     *(optgold + J * 5 + I)= *(optgold + J * 5 + I - 1); 
                } 
            } 
            
            { 
                int型プリ= 0 ; // これは金採掘されないが、最大
                IF(I - 1。 > = 0 
                { 
                    プリ = *(J * + optgold 5 + I - 1 ); 
                } 
                int型 Mnow =ゴールド[I]; // 現在の金採掘、最大
                IF(I - 1。 > = 0 - && J研究者[I]> = 0 
                { 
                    Mnow = + Mnow *(optgold +(J -研究者[I]) *5 + I - 1 )。
                } 
                場合(PRE> mnow)
                {
                     *(optgold + J * 5 + I)= 事前; 
                } 
                
                {
                     *(optgold + J * 5 + I)= mnow。
                } 
            } 
            もし(*(optgold + J * 5 + I)> maxgold)
            { 
                maxgold = *(optgold + J * 5 + I)。
                マキシ = I; 
                maxj = J;
            } 
        } 
    } 
    maxj ++ 一方、(maxj> 0 
    { 
        ためintは iは= 0 ; I <=マキシ; I ++ 
        { 
            場合(*(optgold +(maxj - 1)* 5 + i)は== maxgold)
            { 
                マキシ = I。
                休憩; 
            } 
        } 
        coutの << " " <<ゴールド[マキシ] << " 労働者"<<者[マキシ] << " " <<マキシ+ 1 << てendl; 
        maxj = maxj - 研究者[マキシ]。
        maxgold = maxgold - 金[マキシ]。
        マキシ - ; 
        
    } 
    チャーINCHAR。
    cinを >> INCHAR。
}

問題に遭遇、1、鉱山がリストに追加電流の量を忘れて、現在の私の計算に掘ら;第二に、インデックスjと貧困層の数ので、不便な時に、最終的なトラバース出力につながります。

おすすめ

転載: www.cnblogs.com/studywithallofyou/p/12121507.html