整个题考虑起来 最主要要计算的状态 是树的状态 于是要计算出所有可能挂坠可能组成的树的所有形态 tree 用于保存这些状态 

考虑不要重复计算,有一个vis 数组 

预处理可以先计算出一棵树的重量,简化计算

#include<stdio.h>
#include<iostream>
#include<vector>
#include<algorithm> using namespace std;
const int maxn=6;
int w[6];//各个重量
int sum[1<<maxn]; //储存在i集合树的情况下总重量
int n,s;
double r;
int vis[1<<maxn];//探究当前组成的树是否被构造过 struct Tree{
double r,l;
Tree(): r(0),l(0){
}
};
vector<Tree>tree[1<<maxn];//下标的树组成的全部可能形态
void dfs(int root){ //计算以root 组成一棵树的所有可能形态,并标记已记录
if(vis[root])return;
vis[root]=true;
bool ok=false;
for(int left=root&(root-1);left;left=(left-1)&root){
int right=left^root;
ok=true;
dfs(left);
dfs(right);
double d1=(sum[left]*1.0)/(sum[root]*1.0);
double d2=(sum[right]*1.0)/(sum[root]*1.0);
for(int i=0;i<tree[left].size();i++){
for(int j=0;j<tree[right].size();j++){
Tree t;
t.l=max(tree[left][i].l+d1,tree[right][j].l-d2);
t.r=max(tree[left][i].r-d2,tree[right][j].r+d2);
if(t.l+t.r<r)tree[root].push_back(t);
}
}
}
if(!ok)tree[root].push_back(Tree());//如果当前树只有一个挂坠,那么这是一个空树
}
int main()
{
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
cin>>n;
while(n--){
cin>>r>>s;
for(int i=0;i<s;i++){
cin>>w[i]; }
for(int i=0;i< 1<<s;i++){
vis[i]=false;
tree[i].clear();
sum[i]=0;
for(int j=0;j<s;j++){
if(i&(1<<j))sum[i]+=w[j];
}
}//存储重量的预处理 利用一个二进制数存储了所有的信息;
int root=(1<<s)-1;
dfs(root);
long double ans=-1;
for(int i=0;i<tree[root].size();i++){
if(tree[root][i].l+tree[root][i].r>ans)ans=tree[root][i].l+tree[root][i].r;
}
cout<<ans<<endl;
}
}  

最新文章

  1. VB关闭其他进程的输入法
  2. laravel中日志为daily时如何设置最大保存天数
  3. spring mvc 框架搭建及详解
  4. 流媒体学习三-------SIP消息结构详解
  5. [kuangbin带你飞]专题二十二 区间DP
  6. 291. Word Pattern II
  7. ios--图片处理(修改、保存)UIGraphicsBeginImageContext
  8. Event Sourcing - ENode(三)
  9. CentOS 6.5玩转自制Linux、远程登录及Nginx安装测试
  10. Android service 服务的应用之电话监听器以及短信监听器
  11. 超级好用的前端开发测试Chrome插件-WEB前端助手(FeHelper)
  12. Delphi 开发手机 App 与其他工具之间的比较分析
  13. [dts]Device Tree机制【转】
  14. 微信小程序--家庭记账本开发--03
  15. JavaScript代码优化
  16. Apache Kafka - KIP-42: Add Producer and Consumer Interceptors
  17. 反射中Class.forName()和ClassLoader.loadClass()的区别
  18. 早上突然看明白 shader和材质球的关系
  19. python二叉树简单实现
  20. &lt;UIKit&gt;关于剪贴板共享数据

热门文章

  1. [MySQL] 号称永久解决了复制延迟问题的并行复制,MySQL5.7
  2. ubuntu下postgreSQL安装配置
  3. delphi 串口 关于RS485总线通信协议开发注意事项
  4. windows平台eclipse for C++开发环境搭建
  5. CSS第二章
  6. (Tree) 101. Symmetric Tree
  7. test spring in category
  8. Combobox
  9. WEB页面采集器编写经验之一:静态页面采集器
  10. (整理)C#基础知识_泛型的实现