题目大意:给定一个有 N 个数的集合,将这 N 个数均分成两堆,求差值最小是多少。

题解:有关集合选数的问题,应该是背包问题,同时要求均分可知,选出的物品数目也应该是背包费用的一个维度,因此这是一个多维费用背包问题。设状态 \(dp[i][j][k]\) 表示考虑了前 i 个数字,已经选了 j 个数字,数字之和为 k 的情况是否可行,可知状态转移方程为 \(dp[i][j][k]|=dp[i-1][j-1][k-w[i]]|dp[i-1][j][k]\)。最后进行滚动数组优化即可。

代码如下

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n,w[110],sum,dp[60][45000];
  4. void read_and_parse(){
  5. scanf("%d",&n);
  6. for(int i=1;i<=n;i++)scanf("%d",&w[i]),sum+=w[i];
  7. dp[0][0]=1;
  8. }
  9. void solve(){
  10. for(int i=1;i<=n;i++)
  11. for(int j=n>>1;j>=1;j--)
  12. for(int k=sum;k>=w[i];k--)
  13. dp[j][k]|=dp[j-1][k-w[i]];
  14. int ans=0,tmp=sum;
  15. for(int k=1;k<=sum;k++)if(dp[n>>1][k]){
  16. if(abs(sum-2*k)<tmp)ans=k,tmp=abs(sum-2*k);
  17. else break;
  18. }
  19. printf("%d %d\n",min(sum-ans,ans),max(sum-ans,ans));
  20. }
  21. int main(){
  22. read_and_parse();
  23. solve();
  24. return 0;
  25. }

【codevs1959】拔河比赛的更多相关文章

  1. codevs1959拔河比赛(二维费用背包)

    1959 拔河比赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold     题目描述 Description 一个学校举行拔河比赛,所有的人被分成了两组,每个人 ...

  2. CODEVS 1959 拔河比赛(另一版本)

    题目描述 Description 一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近. 输入描述 ...

  3. rqnoj71 拔河比赛

    题目描述 superwyh的学校要举行拔河比赛,为了在赛前锻炼大家,老师决定把班里所有人分为两拨,进行拔河因为为锻炼所以为了避免其中一方的实力过强老师决定以体重来划分队伍,尽 量保持两个队伍的体重差最 ...

  4. c 指针 及其位运算循环移动拔河比赛问题代码

    week_2_day1_7.7 周一//用字符数组 来实现 字母大小写转换#include<stdio.h>void desc( char *a ,int n){    char  *i ...

  5. codevs 1959 拔河比赛--判断背包内刚好装满n/2个物品

    1959 拔河比赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 一个学校举行拔河比赛,所有的 ...

  6. 【dp】拔河比赛

    01背包:感谢ZCK大佬 题目描述 学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近. 输入 输入中 ...

  7. [深搜]A. 【例题1】拔河比赛

    A . [ 例 题 1 ] 拔 河 比 赛 A. [例题1]拔河比赛 A.[例题1]拔河比赛 解析 模板题,选与不选 Code #include <bits/stdc++.h> #defi ...

  8. 【C/C++】拔河比赛/分组/招商银行

    题目:小Z组织训练营同学进行一次拔河比赛,要从n(2≤n≤60,000)个同学中选出两组同学参加(两组人数可能不同).对每组同学而言,如果人数超过1人,那么要求该组内的任意两个同学的体重之差的绝对值不 ...

  9. 【解题报告】[动态规划]RQNOJ - PID72 / 拔河比赛

    原题地址:http://www.rqnoj.cn/problem/72 解题思路:基本的01背包问题. 要求的就是在这些人中选出一些人,使得这些人的体重的和 不超过所有人的体重的一半 并最大. 代码: ...

随机推荐

  1. Django Rest Framework源码剖析(七)-----分页

    一.简介 分页对于大多数网站来说是必不可少的,那你使用restful架构时候,你可以从后台获取数据,在前端利用利用框架或自定义分页,这是一种解决方案.当然django rest framework提供 ...

  2. 20155302 Exp2 后门原理与实践

    20155302<网络对抗>后门原理与实践 实验要求 1.使用netcat获取主机操作Shell,cron启动 (0.5分) 2.使用socat获取主机操作Shell, 任务计划启动 (0 ...

  3. matplotlib 雷达图2

    说明 搞了一个最新版本的雷达图,比以前那个美观. 不多说,代码奉上: 完整代码 ''' matplotlib雷达图 ''' import numpy as np import matplotlib.p ...

  4. HTML 背景实例

    71.HTML 背景实例好的背景使站点看上去特别棒.背景(Backgrounds)<body> 拥有两个配置背景的标签.背景可以是颜色或者图像.<body> 标签中的背景颜色( ...

  5. docker之搭建LNMP

    一.部署mysql [root@node03 web]# docker run -itd --name lnmp_mysql -p 3308:3306 -e MYSQL_ROOT_PASSWORD=1 ...

  6. Tkernel Package NCollection哈希基础的类

    OpenCASCADE内用到了很多由诸如NCollection_Map, NCollection_DataMap, NCollection_DoubleMap, NCollection_Indexed ...

  7. Kali信息收集-搜索引擎

    1.google hacking intext:搜索正文内容 intitile:网页标题中的内容 inurl:url中的关键字 site:目标站点下 filetype:文件类型 cache:缓存 li ...

  8. Individual Project - Word frequency program by HJB

    using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;us ...

  9. "软件"和"软件工程"一词最早被谁提出?

    1."softwar”:1953年Richard R.Carhart在备忘录中使用software一词2.软件工程 1968 年北大西洋公约组织在前联邦德国开会提出的 1968年秋季,NAT ...

  10. SQLServer2008只能编辑前面200行数据

    设置编辑所有行:操作步骤:打开数据库-〉工具-〉选项-〉sqlserver对象资源管理器-〉命令 把200改为0,即可编辑所有行了