用二进制表示你手上有哪些票,用掉一张就在对应二进制位置上把1变0
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=31;
const int INF=0x3f3f3f;
int n,m,p,a,b;
int t[maxn];
int map[maxn][maxn];
double dp[1<<10][maxn];//
int main()
{
while(scanf("%d%d%d%d%d",&n,&m,&p,&a,&b)!=EOF)
{
if(!n&&!m)
break;
memset(map,0,sizeof(map));
for (int i=0;i<n;i++)
scanf("%d",&t[i]);
for (int i=0;i<p;i++)
{
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
map[u][v]=map[v][u]=c;
}
for (int i=0;i<(1<<n);i++)
fill(dp[i],dp[i]+m+1,INF);
dp[(1<<n)-1][a]=0;
double res=INF;
for (int i=(1<<n)-1;i>=0;i--)
for (int u=1;u<=m;u++)//下一个城市
for (int j=0;j<n;j++)
if (i&(1<<j))
for (int v=1;v<=m;v++)//现在所在的城市
if (map[v][u])
//使用车票j,并更新状态,从v移动到u
dp[i&~(1<<j)][v]=min(dp[i&~(1<<j)][v],dp[i][u]+(double)map[u][v]/t[j]);
for(int i=0;i<(1<<n);i++)
res=min(res,dp[i][b]);
if(res==INF)
printf("Impossible\n");
else
printf("%.3f\n",res);
}
return 0;
}