题目大意:原题链接

给定n个节点,任意两个节点之间有权值,把这n个节点分成A,B两个集合,使得A集合中的每一节点与B集合中的每一节点两两结合(即有|A|*|B|种结合方式)权值之和最大。

标记:A集合:true  B集合:false

解法一:dfs+剪枝

#include<iostream>
#include<cstring>
using namespace std;
int n,ans;
bool in[];
int graph[][];
void dfs(int i,int cursum)
{
in[i]=true;
int maxsum=cursum;
for(int j=;j<=n;j++){
if(!in[j]) maxsum+=graph[i][j];
else maxsum-=graph[i][j];
}
if(maxsum>ans) ans=maxsum;
if(maxsum>cursum){//枚举+递归
for(int j=i+;j<=n;j++)
dfs(j,maxsum);
}//如果加进A组没有使得maxsum增大,则不加进去
in[i]=false;
}
int main()
{
cin>>n;
memset(in,,sizeof(in));
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)
cin>>graph[i][j];
}
ans=;
dfs(,);
cout<<ans<<endl;
}

解法二:随机化算法(好神奇的思路)

#include<iostream>
#include<cstdlib>
using namespace std;
const int TLE=;//本题时间限制为2000ms
int main()
{
int n,m[][];
cin>>n;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)
cin>>m[i][j];
}
/*Random Algorithm*/
bool in[]={false};
int time=*TLE;//使随机次数尽可能大,随机结果尽可能接近最优解
int maxsum=,cursum=;
while(time--){
int x=rand()%n+;//范围:1~n
in[x]=!in[x];//改变x所在的集合位置
for(int i=;i<=n;i++){
if(in[i]!=in[x]) cursum+=m[i][x];
else cursum-=m[i][x];
}
if(maxsum<cursum) maxsum=cursum;
}
cout<<maxsum<<endl;
}

最新文章

  1. 2-5. Working with Compile Time Constants
  2. 2016 5.03开始记录我的it学习。
  3. tiff或tif文件的读取
  4. jQuery对表单、表格的操作及更多应用(中:表格应用)
  5. 148. Sort List -- 时间复杂度O(n log n)
  6. Sqoop 命令
  7. codeforces -- 283A
  8. Android中支持的常用距离单位
  9. Mac OS使用技巧之十五:快捷方便的Mini Dock
  10. Cygwin-添加到右键菜单脚本--一键安装、卸载
  11. linux命令和知识点
  12. neutron之neutron_openvswitch_agent占用100%CPU资源问题
  13. hdu 4027 Can you answer these queries?[线段树]
  14. 【Codeforces Round 1114】Codeforces #538 (Div. 2)
  15. (转)synchronized和lock的区别
  16. 如何通过&lt;include/&gt;标签重用Mybatis的代码段
  17. NET设计模式 第二部分 创建型模式(6):创建型模式专题总结(Creational Pattern)
  18. Alpha冲刺——day6
  19. Linux SVN 服务器
  20. Android记录20-获取缓存大小和清除缓存功能

热门文章

  1. boost实用工具:typeof库 BOOST_TYPE BOOST_AUTO
  2. 【SharePoint 2010】SharePoint 2010开发方面的课堂中整理有关问题
  3. 深入理解ByteBuffer
  4. Struts2 取消 下载时异常
  5. json序列化懒加载问题
  6. CH5402 选课【树形DP】【背包】
  7. Servlet的请求转发和重定向
  8. js 一些基础知识
  9. because of an existing model object of the same name
  10. bash characters