题目\(1\)

Description

  一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,且两个组内的所有人体重加起来尽可能地接近.

Input

  第\(1\)行是一个\(n\),表示参加拔河比赛的总人数,\(n<=100\),接下来的n行表示第\(1\)到第\(n\)个人的体重,每个人的体重都是整数\((1<=weight<=450)\)。

Output

  包含两个整数:分别是两个组的所有人的体重和,用一个空格隔开。注意如果这两个数不相等,则请把小的放在前面输出。

Sample Input 1

3
100 90 200

Sample Output 1

190 200

Hint

\(n<=100,1<=weight<=450\)

模型

\(0-1\)背包

解法

转换成成一个花费\(=\)价值的\(0-1\)背包问题,记\(F[i][j]\)为用前\(i\)个物品,总代价\(<=j\)能取得的最大价值,可得状态转移方程:

\[F[i][j]=max(F[i][j],F[i][j]-w[i]]+w[i])
\]

最后答案即为\(F[N][Sum/2]\),其中\(Sum=\sum_{i=1}^Nw[i]\).

实际代码中,还可以使用滚动数组来优化空间.

代码

#include<bits/stdc++.h>
using namespace std; #define MaxN 105
#define Maxw 45005
int w[MaxN],N;
int F[Maxw];
int Tx=0; int main()
{
cin>>N;
for(int i=1;i<=N;i++)
{
cin>>w[i];
Tx+=w[i];
}
for(int i=1;i<=N;i++)
for(int P=Tx;P;P--)
if(P-w[i]>=0)
F[P]=max(F[P],F[P-w[i]]+w[i]);
cout<<F[Tx/2]<<" "<<Tx-F[Tx/2]<<endl;
return 0;
}

题目\(2\)

Description

  一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,两个队伍的人数之差不能超过1,且两个组内的所有人体重加起来尽可能地接近.

Input

  第\(1\)行是一个\(n\),表示参加拔河比赛的总人数,\(n<=100\),接下来的n行表示第\(1\)到第\(n\)个人的体重,每个人的体重都是整数\((1<=weight<=450)\)。

Output

  包含两个整数:分别是两个组的所有人的体重和,用一个空格隔开。注意如果这两个数不相等,则请把小的放在前面输出。

Sample Input 1

3
100 90 200

Sample Output 1

190 200

Hint

\(n<=100,1<=weight<=450\)

模型

\(0-1\)背包

解法

同样转换成成一个花费\(=\)价值的\(0-1\)背包问题,记\(F[i][j][k]\)为在前\(i\)个物品中选择\(k\)个,总代价\(<=j\)能取得的最大价值.可得状态转移方程:

\[F[i][j][k]=max(F[i][j][k],F[i-1][j-1][k-w[i]]+w[i])
\]

最终答案即为\(F[N][N/2][Sum]\),其中\(Sum=\sum_{i=1}^Nw[i]\).

同样可以采用滚动数组优化,还要注意初始化边界.

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f
#define MaxN 105
#define Maxw 45005
int w[MaxN],N;
int F[MaxN][Maxw];
int Tx=0; int main()
{
cin>>N;
for(int i=1;i<=N;i++)
{
cin>>w[i];
Tx+=w[i];
}
memset(F,-INF,sizeof(F));
for(int i=0;i<=Tx>>1;i++)
F[0][i]=0;
for(int i=1;i<=N;i++)
for(int j=i;j>=1;j--)
for(int P=Tx>>1;P>=w[i];P--)
F[j][P]=max(F[j][P],F[j-1][P-w[i]]+w[i]); int Ans=F[N>>1][Tx>>1];
if(N%2)
Ans=max(Ans,F[(N>>1)+1][Tx>>1]);
cout<<Ans<<" "<<Tx-Ans<<endl;
return 0;
}

还要注意,本题中第三重循环必须从\(Sum/2\)开始,即代码中的

for(int P=Tx>>1;P>=w[i];P--)

否则会超时.

CQYZOJ P1392 拔河问题的更多相关文章

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

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

  2. rqnoj71 拔河比赛

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

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

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

  4. P1392 取数

    P1392 取数 题目描述 在一个n行m列的数阵中,你须在每一行取一个数(共n个数),并将它们相加得到一个和.对于给定的数阵,请你输出和前k小的取数方法. 说明 对于20%的数据,n≤8 对于100% ...

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

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

  6. 【dp】拔河比赛

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

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

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

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

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

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

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

随机推荐

  1. C++\CLI使用.net委托,*Callback注意"this"

    今天在使用c++\cli的时候遇到了点关于委托,callback使用的问题,简单记录一下 首先贴段简单的C#中使用System.Threading.Timer的代码.    Timer GameTim ...

  2. 2020qbxt游记

    csp-s 突破 ----------------------------------------- 1-15 下午才走,这实在是太恶心了.然而因为感冒,当众大佬们都在上学的时候,我在家里睡觉. 2: ...

  3. P1028 数的计算( 记忆剪枝 )

    题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数 n ): 先输入一个自然数 n(n≤1000),然后对此自然数按照如下方法进行处理: 不作任何处理; 在它的左边加上一个自然数,但该自然数 ...

  4. Linux中为什么执行自己的程序要在前面加./

    前言   在Linux中,我们执行内置命令时,直接输入命令名称即可,如: $ mv a b #将a重命名为b   而在执行自己写好的程序时,却要带上./,例如: $ hello hello: comm ...

  5. 有关es6的模块化

    假如有两个文件:app.js和config.js app.js为主文件要去引用config这个模块 以前学习node时使用的模块导出: 需求:导出三个成员,分别是 foo: bar f: functi ...

  6. Exec msdb.dbo.sp_send_dbmail 参数详解(SQL Server 存储过程发邮件)

    转载oriency755 发布于2012-12-04 11:34:45 阅读数 6870 收藏   sp_send_dbmail [ [ @profile_name = ] 'profile_name ...

  7. springMVC项目配置文件

    一.springMVC项目配置文件 1.web.xml文件全局配置 <servlet> <servlet-name> dispatcher </servlet-name& ...

  8. Docker 使用记录

    1.Docker 镜像加载本地镜像 2.Docker 创建镜像: 创建dockerfile 文件: 进入到文件目录下: 输入命令 docker build -t xxxx . 注意:后面的小点要有, ...

  9. 小总结:快速幂+贪心————Bit Mask____UVA 10718 多多去理解去温习哦!

    传送门:https://vjudge.net/problem/UVA-10718 Preview: bitstream:a flow of data in binary form. in bit-wi ...

  10. 回文串--Manacher算法(模板)

    用途:在O(n)时间内,求出以每一个点为中心的回文串长度. 首先,有一个非常巧妙的转化.由于回文串长度有可能为奇数也有可能为偶数,说明回文中心不一定在一个字符上.所以要将字符串做如下处理:在每两个字母 ...