Vijos P1153 猫狗大战(动态规划,背包)
描述
新一年度的猫狗大战通过SC(星际争霸)这款经典的游戏来较量,野猫和飞狗这对冤家为此已经准备好久了,为了使战争更有难度和戏剧性,双方约定只能选择Terran(人族)并且只能造机枪兵。
比赛开始了,很快,野猫已经攒足几队机枪兵,试探性的发动进攻;然而,飞狗的机枪兵个数也已经不少了。野猫和飞狗的兵在飞狗的家门口相遇了,于是,便有一场腥风血雨和阵阵惨叫声。由于是在飞狗的家门口,飞狗的兵补给会很快,野猫看敌不过,决定撤退。这时飞狗的兵力也不足够多,所以没追出来。
由于不允许造医生,机枪兵没办法补血。受伤的兵只好忍了。555-
现在,野猫又攒足了足够的兵力,决定发起第二次进攻。为了使这次进攻给狗狗造成更大的打击,野猫决定把现有的兵分成两部分,从两路进攻。由于有些兵在第一次战斗中受伤了,为了使两部分的兵实力平均些,分的规则是这样的:1)两部分兵的个数最多只能差一个;2)每部分兵的血值总和必须要尽可能接近。现在请你编写一个程序,给定野猫现在有的兵的个数以及每个兵的血格值,求出野猫按上述规则分成两部分后每部分兵的血值总和。
格式
输入格式第一行为一个整数n(1<=n<=200),表示野猫现在有的机枪兵的个数。以下的n行每行一个整数,表示每个机枪兵的血格(1<=ai<=40)。
输出格式只有一行,包含两个数,即野猫的每部分兵的血值总和,较小的一个值放在前面,两个数用空格分隔。
样例1
样例输入1[复制]3 35 20 32 样例输出1[复制]
35 52
提示
TO 狗狗:这道题的数据范围我已经尽量按星际的游戏规则来了,如果你再固执于由于机枪兵的攻击力一定使不能达到某些血格值或者游戏中一定要造农民不能使机枪兵的人数达到200的话,我只能决定将那场猫狗大战的录像公开于世人了!
样例分析
输入机枪兵的人数n=3
输入n个机枪兵的血格,要求将所有的机枪兵分成两组,最多相差一人,并且总的血格数尽可能接近,所以用f[j][k]表示j个机枪兵组成k个血格的状态
f[j][k]=f[j][k]||f[j-1][k-a[i]];
a[1]=35,则f[1][35]=1,即有一个机枪兵形成35的血格
a[2]=20,则f[1][20]=1,若一开始的总人数>=4,则还要计算f[2][55]=1,也就是计算到人数的一半可能形成的血格数
a[3]=32,则f[1][32]=1
将总的血格数sum倒序循环,找到第一个f[n/2][i]不为0的值i,就是要求的第一个值,当然另一个就是sum-i
为了使两队的总血格数尽可能接近,显然少的那队不会超过sum的一半
当然输入的同时累加sum
代码
#include <iostream>
#define N 200
using namespace std;
int n,sum,a[N+1],f[N/2+1][N*20+1];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
f[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=n/2;j;j--)
for(int k=sum/2;k>=a[i];k--)
f[j][k]=f[j][k]||f[j-1][k-a[i]];
for(int i=sum/2;i>=0;i--)
if(f[n/2][i])
{
cout<<i<<' '<<sum-i<<endl;
return 0;
}
}
相关知识
Vijos P1153 猫狗大战(动态规划,背包)
===动态规划===
宠物文化风行之《猫狗大战》再起风波
猫狗大战手机版
猫狗大战正式版下载
猫狗大战作文9篇
猫狗大战RPG下载
LOL猫狗大战什么时候结束
LOL猫狗大战任务有哪些?全部猫狗大战任务汇总
猫狗大战手游下载
网址: Vijos P1153 猫狗大战(动态规划,背包) https://www.mcbbbk.com/newsview627459.html
上一篇: 世界赛猪狗大战!LPL最后的希望 |
下一篇: 【每日一撸】Uzi厂长再对决但在 |
推荐分享

- 1我的狗老公李淑敏33——如何 5096
- 2南京宠物粮食薄荷饼宠物食品包 4363
- 3家养水獭多少钱一只正常 3825
- 4豆柴犬为什么不建议养?可爱的 3668
- 5自制狗狗辅食:棉花面纱犬的美 3615
- 6狗交配为什么会锁住?从狗狗生 3601
- 7广州哪里卖宠物猫狗的选择性多 3535
- 8湖南隆飞尔动物药业有限公司宠 3477
- 9黄金蟒的价格 3396
- 10益和 MATCHWELL 狗 3352