溶液
この状態は、との良好な質問、希望F [i]の[j]を表現するためにj番目のi番目の第2のステーションどのくらいの時間、少なくとも、前中のi、j番目の第二ステーションを、車かどうかのデータがあってもよいことに注意してくださいそれはなり超えるために注意を払うために、Tをクリアされます。
コード
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 CONSTの INT N = 55 。 int型 T [N]、HT [ 10005 ] [N] [ 2 [F]、CNT、K、N、T、M1、10005 ] [N]。 INT メイン(){ freopenは(" a.in "、" R " 、STDIN)。 一方、(scanf関数(" %のD "、&N)== 1個の && N){ scanf関数(" %のD "、&T)。 memsetの(HT、0、はsizeof(HT))。 memset(T、0、はsizeof (T)); //清零 ため(int型 i = 1 ; iがN <; I ++)はscanf関数(" %のD "、およびT [I])。 int型の合計。 scanf関数(" %のD "、&M1)。 以下のために(int型 I = 1 ; I <= M 1; iは++ ){ scanf関数(" %のD "、および合計)。 用(INT J = 1 ; J <= N; J ++ ) HT [和] [j] [ 0] = 1、合計+ = T [J]; //正向不变 } のscanf(" %dの"、&M1)。 以下のために(int型 I = 1 ; I <= M 1; iは++ ){ scanf関数(" %のD "、および合計)。 以下のために(INT ; J> = J = N 1 ; j-- ) HT [和] [J] [ 1 ] = 1、合計+ = T [J- 1 ]; //记住-1 } のために(int型のI = 1 ; iがN <; I ++)は[T] [I] = F 0x3f3f3f3f。 F [T] [N] = 0 ; 以下のために(int型のI = T- 1 ; I> = 0 ; i-- ) のための(int型 J = 1 ; J <= nであり、j ++ ){ F [I] [J] = F [iが+ 1 ] [J] + 1 ; もし(J <N && HTは、[I]は[j]は[ 0 ] && iがT [j]は<= + T) Fを[I]は[j]は(分= F [I] [J]、[私はTを+ F [J] ] [J + 1 ])。 もし(J> 1つの && HT [I] [J] [ 1 ] && iがTを+ [J- 1 ] <= T) F [I] [J]=分(F [I] [J]、F [iが+ T [J- 1 ]] [J- 1 ])。 } のprintf(" ケース番号%D:"、++ CNT)。 もし(F [ 0 ] [ 1 ]> = 0x3f3f3f3f)プット(" 不可能" ); // 0x3fを挂了 他のprintf(" %Dを\ n " F [ 0 ] [ 1 ])。 } }