ポータル:https://www.luogu.org/problem/SP1700
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 int型N、M、P、S、Z。 4 int型 T [ 100 ]。 5 int型 PLAT [ 100 ] [ 100 ]。 6 二重 DP [ 100 ] [ 1 << 10 ]。 7 INT メイン() 8 { 9 ながら(scanf関数(" %D%D%D%D%D "、&N、&M、&P&S&Z)!= EOF) 10 { 11 かの(M個の== 0&& N == 0)ブレーク。 12 のmemset(PLAT、0、はsizeof (PLAT))。 13 のためには、(int型、I = 0 ; I <= M; iは++ ) 14 充填(DP [I]、DP [I] +(1 << N)+ 1、0x3f3f3f3f )。 15 のためには、(int型、I = 0のscanf(; iがn <Iが++)" は%d "、&T [I])。 16 のために(int型 I = 0 ; iがpは<Iは++ ) 17 { 18 INT X、Y、V; 19 scanfの(" %D%D%D "、およびX&Y、&V); 20である のPlat [X] [Y] = Platの[Y] [X]は= Vを、 21である } 22は DP [S] [(1 - << N-)1 ] = 0 ; //最初のポイントを、チケットが0で表現されることなく、無駄な表す 23である ため(int型 I =(1 << N - ) - 1 ; I> = 0 ; I - )//列挙チケット使用状態 24 { 25 のために(INT U = 1 ; U <= M; U ++ )//列挙原点 26 { 27 のために(INT J = 0 ; J <N-、J ++は)//列挙は、チケット使用 28 { 29 IF(I&(1 << J))を使用していないチケット場合// 30 { 31である ため(INT V = 1 ; V <= M; V ++ )//列挙エンド 32 { 33は IF (Platの[U] [V])//アクセス場合 34である { 35 DP [V] [I&〜(1 << J)]分=(DP [V] [I&〜(1 << J)]、DP [U] [I] +(ダブル)のPlat [U] [V] /T [J]);
10001が実行される//、それは01110〜なり、I&〜(1 << j)がチケットをマークするために使用して 36 } 37 } 38である } 39 } 40 } 41れる } 42が ダブル ANS = 0x3f3f3f3f ; 43である ため(int型 I = 0 ; Iは、(< 1。 I ++は、<<のN-))= ANS 分(ANS、DP [Z] [I]); 44は、 IF(ANS == 0x3f3f3f3f)COUT << " 不可「 << てendl; 45 他のprintf(" %.3lfの\ nを" 、ANS)。 46 } 47 リターン 0 。 48 }