#include<bits/stdc++.h> typedefint int32; #define int long long usingnamespace std; constint N = 100 + 5; int n, m, dp[N][1 << 9][N], ans; signedmain() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin >> n >> m; dp[0][0][0] = 1; for (int i = 1; i <= n; i++) for (int j = 0; j < (1 << n); j++) if (!((j << 1) & j)) { int tmp = __builtin_popcount(j); for (int k = 0; k < (1 << n); k++) if (!((j << 1) & k) && !(j & k) && !((k << 1) & j)) for (int l = tmp + __builtin_popcount(k); l <= m; l++) dp[i][j][l] = dp[i][j][l] + dp[i - 1][k][l - tmp]; if (tmp) ans += dp[i][j][m]; } cout << ans; return0; }
#include<bits/stdc++.h> typedefint int32; #define int long long usingnamespace std; constint N = 30 + 5; int n, m, k, x, y, a[N], b[N][N]; double dp[1 << 8][N], ans; vector<int>nbr[N]; signedmain() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); while (cin >> n >> m >> k >> x >> y) { if (!n) break; for (int i = 0; i < n; i++) cin >> a[i]; for (int i = 1; i <= m; i++) nbr[i].clear(); for (int i = 1; i <= k; i++) { int x, y; cin >> x >> y; cin >> b[x][y]; b[y][x] = b[x][y]; nbr[x].push_back(y); nbr[y].push_back(x); } ans = 1e9; for (int i = 0; i < (1 << n); i++) for (int j = 1; j <= m; j++) dp[i][j] = 1e9; dp[0][x] = 0; for (int i = 1; i < (1 << n); i++) for (int j = 0; j < n; j++) if ((i >> j) & 1) for (int k = 1; k <= m; k++) { for (auto& nxt : nbr[k]) dp[i][k] = min(dp[i][k], dp[i ^ (1 << j)][nxt] + b[k][nxt] * 1.00 / a[j]); if (k == y) ans = min(ans, dp[i][k]); } if (ans == 1e9) cout << "Impossible\n"; else cout << fixed << setprecision(3) << ans << '\n'; } return0; }