Lightoj 1147【DP】
2024-08-30 09:10:58
题意:
把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;
}
最新文章
- poj 1698 Alice‘s Chance
- xmind的第五天笔记
- Ghost的相关问题
- 配置 Hdp 4 Window 中的一些问题
- Eclipse选择rt.jar的源代码的位置
- 【原创】基于禅道的Bug管理操作规范
- spring boot 下 thymeleaf 配置
- 【Java并发编程】13、forkjoin
- java快速排序引起的StackOverflowError异常
- vue 数据请求
- 设置nginx反向代理将80端口转发到9999端口
- Trie树子节点快速获取法
- Tunnelblick 覆盖安装失败
- IP地址及子网--四种IP广播地址
- Tensorflow 深度学习简介(自用)
- 数据库选型之MySQL(多线程并发)
- zt <;Windows Image Acquisition (WIA)>; from msdn
- html5 -audio-移动端如何自动播放
- 计算从哪天起应该购买预售火车票.cs
- python基础之内建函数(二)
热门文章
- 800元组装一台3D打印机全教程流程-零件清单
- kbmmw 5 的日志备份功能简介
- mvn 添加本地jar包
- ArcGIS10和ArcGIS10.1关于AO Licence初始化的问题
- java中两字符串比较--compareTo方法
- 使用Primose方式解决异步编程回调的一些问题--animate动画的例子
- Hihocoder #1095 : HIHO Drinking Game (微软苏州校招笔试)( *【二分搜索最优解】)
- 信息发布员和频道管理员如何查看dedecms自定义表单内容
- 存储过程系列五:完整的存储过程备份使用函数REPLACE()substr()
- linux下syslog使用说明