题意:

把n个人分成两部分,要你怎么分使得两部分尽可能相等;

思路:

如果我们把一部分人的重量达到离sum/2最近,那就一定行啊

其实就是一条棒,两种不同的棒去拼接成一条棒,然后最好就是离mid最近,一定会得到这个值啊。

然后搞出这个值,mid-x就是他们的最小差值。不就是一个0/1背包取或不取。

然后wa了,人数相差不超过1个///

后来肯定要维护人数啊,纯粹的+,dp[j]=dp[j-a[i]]+1;这样不行啊,可能这个 j 是由多种组合过来的,

我们还是维护一半人数,最多50,所以我们可以状压,然后表示状态,比如dp[100]=6(110) 就意味着是可以4个人组合,或者2个人组合;

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;
const double eps=1e-5;
const double pi=acos(-1.0);
const int INF=0x3f3f3f3f;
LL dp[100100];
int a[110];
int n; int main()
{
int T,cas=1;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int sum,w,x;
memset(dp,0,sizeof(dp));
sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
w=sum/2;
dp[0]=1;
for(int i=1;i<=n;i++)
for(int j=w;j>=a[i];j--)
dp[j]|=(dp[j-a[i]]*2LL);
for(int i=w;i>=0;i--)
{
if(dp[i]&(1LL<<((n+1)/2))||dp[i]&(1LL<<(n/2)))
{
x=i;
break;
}
}
printf("Case %d: %d %d\n",cas++,x,sum-x);
}
return 0;
}

最新文章

  1. poj 1698 Alice‘s Chance
  2. xmind的第五天笔记
  3. Ghost的相关问题
  4. 配置 Hdp 4 Window 中的一些问题
  5. Eclipse选择rt.jar的源代码的位置
  6. 【原创】基于禅道的Bug管理操作规范
  7. spring boot 下 thymeleaf 配置
  8. 【Java并发编程】13、forkjoin
  9. java快速排序引起的StackOverflowError异常
  10. vue 数据请求
  11. 设置nginx反向代理将80端口转发到9999端口
  12. Trie树子节点快速获取法
  13. Tunnelblick 覆盖安装失败
  14. IP地址及子网--四种IP广播地址
  15. Tensorflow 深度学习简介(自用)
  16. 数据库选型之MySQL(多线程并发)
  17. zt &lt;Windows Image Acquisition (WIA)&gt; from msdn
  18. html5 -audio-移动端如何自动播放
  19. 计算从哪天起应该购买预售火车票.cs
  20. python基础之内建函数(二)

热门文章

  1. 800元组装一台3D打印机全教程流程-零件清单
  2. kbmmw 5 的日志备份功能简介
  3. mvn 添加本地jar包
  4. ArcGIS10和ArcGIS10.1关于AO Licence初始化的问题
  5. java中两字符串比较--compareTo方法
  6. 使用Primose方式解决异步编程回调的一些问题--animate动画的例子
  7. Hihocoder #1095 : HIHO Drinking Game (微软苏州校招笔试)( *【二分搜索最优解】)
  8. 信息发布员和频道管理员如何查看dedecms自定义表单内容
  9. 存储过程系列五:完整的存储过程备份使用函数REPLACE()substr()
  10. linux下syslog使用说明