#include "bits/stdc++.h"
using ll = long long ;
#define F first
#define S second
const ll mod = 998244353 ;
const ll N = 2e5 + 5 ;
using namespace std;
double fact[55];
ll n , p , vis[55][55][55] , timer , a[55] , t = 1;
double dp[55][55][55];
double DP(ll i , ll take , ll sum , ll j)
{
if(sum > p)return 0 ;
if(i == n + 1)
{
if(sum + a[j] > p)
{
return take * fact[take] * fact[n - take - 1] / fact[n] ;
}
return 0 ;
}
double &ret = dp[i][take][sum] ;
if(vis[i][take][sum] == timer)return ret ;
vis[i][take][sum] = timer ;
ret = 0.0 ;
if(i == j)return ret = DP(i + 1 , take , sum , j) ;
ret += DP(i + 1 , take + 1 , sum + a[i] , j) ;
ret += DP(i + 1 , take , sum , j) ;
return ret ;
}
int main()
{
//cin >> t ;
while(t--)
{
fact[0] = 1.0 ;
for(int i = 1 ; i <= 50 ; ++i)fact[i] = fact[i - 1] * i ;
cin >> n ;
int sum = 0 ;
for(int i = 1 ; i <= n ; ++i)cin >> a[i] , sum += a[i] ;
cin >> p ;
if(sum <= p){
cout << n << "\n";
return 0;
}
double ans = 0.0 ;
for(int i = 1 ; i <= n ; ++i)
{
timer = timer + 1 ;
ans += DP(1 , 0 , 0 , i) ;
}
cout << fixed << setprecision(10) << ans << "\n";
}
}
36. Valid Sudoku | 557. Reverse Words in a String III |
566. Reshape the Matrix | 167. Two Sum II - Input array is sorted |
387. First Unique Character in a String | 383. Ransom Note |
242. Valid Anagram | 141. Linked List Cycle |
21. Merge Two Sorted Lists | 203. Remove Linked List Elements |
733. Flood Fill | 206. Reverse Linked List |
83. Remove Duplicates from Sorted List | 116. Populating Next Right Pointers in Each Node |
145. Binary Tree Postorder Traversal | 94. Binary Tree Inorder Traversal |
101. Symmetric Tree | 77. Combinations |
46. Permutations | 226. Invert Binary Tree |
112. Path Sum | 1556A - A Variety of Operations |
136. Single Number | 169. Majority Element |
119. Pascal's Triangle II | 409. Longest Palindrome |
1574A - Regular Bracket Sequences | 1574B - Combinatorics Homework |
1567A - Domino Disaster | 1593A - Elections |