CQYZOJ P1392 拔河问题
题目\(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--)
否则会超时.
转载于:https://www.cnblogs.com/TaylorSwift13/p/11172401.html
CQYZOJ P1392 拔河问题相关推荐
- 计算机学院 拔河比赛加油词,运动会拔河比赛加油词
运动会拔河比赛加油词 拔河为双方各执绳一端进行角力的体育活动,属于中国的传统运动项目. 那么运动会拔河比赛加油词有哪些呢?下面是小编为大家带来的运动会拔河比赛加油词! 运动会拔河比赛加油词[1] 集体 ...
- 拔河原理html,大班活动拔河活动教案
大班活动拔河活动教案 教案中对每个课题或每个课时的教学内容,看看下面的大班活动拔河活动教案吧,欢迎借鉴. 大班活动拔河活动教案 活动目标: 1.理解儿歌,掌握儿歌中的拉.摇.咬.叫等动词. 2.感受儿 ...
- 【dfs】拔河比赛(ybtoj dfs-1-1)
拔河比赛 ybtoj dfs-1-1 题目大意 给你n个数,让你分成两堆,使其数量相差不大于1,问数值相差最小是多少 输入样例 1 3 55 50 100 输出样例 5 数据范围 1⩽T⩽501\le ...
- 【动态规划】拔河比赛 (ssl 1638)
拔河比赛拔河比赛拔河比赛 Description 一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接 ...
- 我们在进行着一场拔河比赛……
大家好,我是雄雄,欢迎关注公众号[雄雄的小课堂]. 不知不觉,3班已经面临就业了. 似乎每个班级到三期的最后阶段,出现的问题都那么类似,那就是一部分同学已经"放弃努力"了,大家貌似 ...
- matlab拔河比赛_拔河比赛
matlab拔河比赛 Description: 描述: This is a standard interview problem to divide a set of number to two di ...
- 计算机学院 拔河比赛加油词,校园拔河比赛加油稿
在运动会上,拔河是一项能体现集体精神的比赛.下面是出国留学网小编为您整理的"校园运动会加油稿拔河",仅供参考,希望您喜欢!更多详细内容请点击出国留学网查看. 校园运动会加油稿拔河 ...
- 寂静岭:理性与心魔的拔河
寂静岭长子 姓名:Silent Hill 出生时间:1999年1月 "Silent Hill(寂静岭)"是Konami公司在PS主机上发售了一款恐怖冒险游戏.在这款游戏中,Kona ...
- 【C4】【搜索】拔河比赛
题目描述 在未来号办公室,老师们平时集训脑力劳动力比较重.为了劳逸结合,我们敬爱的梁老师准备了一场拔河比赛,让老师们放松心情. 为了拔河比赛的公正性,梁老师提出以下要求: 1. 拔河比赛两边人数最多不 ...
最新文章
- 食出100分:‘粥’的做法4---鱼片瘦肉粥
- linux 进程 ctrl-c,ctrl-z,ctrl-d
- spark学习:ContextCleaner清理器
- 安全终止MFC线程全
- SSM+Netty项目结合思路
- sklearn决策树概述
- 一道面试题目引发的思考
- 灵魂一问-如何彻底防止APK反编译?成功定级腾讯T3-2
- 重定位----操作系统做的事情
- .NET 靠开源再“出圈”!
- android之uniapp自定义基座
- 电脑只有一个c盘怎么办_新买的电脑,拿到手只有一个C盘,如何分成两个盘
- C++简介(5)STL
- unity使用html播放器,Unity Web Player and browser communication Unity网络播放器和浏览器通信...
- bootdo框架切换tab标签时自动刷新,无需手动刷新
- 渗透测试-SQL注入检测
- 微信小程序短信倒计时60s功能
- Latex: 表格内换行
- w7系统计算机更改用户名,win7系统用户名不能修改的解决方法
- 爬取https://sc.chinaz.com/tupian/的图片