题目:https://vjudge.net/problem/UVA-1354
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#pragma warning(disable:4996)
using namespace std;
const int maxn = 12;
int n, idx, vis[maxn], w[maxn];
double r, ans, rw[maxn], lw[maxn];
void dfs(int dep)
{
if (dep == n)
{
for (int i = 1; i <= idx; i++)
{
if (!vis[i]) continue;
if (rw[i] + lw[i] > r) continue;
ans = max(ans, rw[i] + lw[i]);
}
return;
}
for (int i = 0; i < maxn; i++)
{
if (vis[i])
{
for(int j = 0;j < maxn;j++)
if (i != j && vis[j])
{
double L = max(lw[i], lw[j] - 1); double R = max(rw[j], rw[i] - 1);
if (1 + L + R < r)
{
vis[i] = vis[j] = 0;
int id = idx++;
vis[id] = 1;
w[id] = w[i] + w[j];
lw[id] = w[j] * 1.0 / w[id] + L;
rw[id] = w[i] * 1.0 / w[id] + R;
dfs(dep + 1);
vis[i] = vis[j] = 1;
vis[--idx] = 0;
}
}
}
}
}
int main()
{
int T;
cin >> T;
while (T--)
{
cin >> r >> n;
ans = -1; idx = 0;
memset(vis, 0, sizeof(vis));
memset(rw, 0.0, sizeof(rw));
memset(lw, 0.0, sizeof(lw));
for (int i = 0; i < n; i++)
{
cin >> w[i];
vis[idx++] = 1;
}
if (n == 1) { printf("0.0000000000\n"); continue; }
dfs(1);
printf("%.10lf\n", ans);
}
return 0;
}