「vijos1153」猫狗大战
描述
新一年度的猫狗大战通过SC(星际争霸)这款经典的游戏来较量,野猫和飞狗这对冤家为此已经准备好久了,为了使战争更有难度和戏剧性,双方约定只能选择Terran(人族)并且只能造机枪兵。
比赛开始了,很快,野猫已经攒足几队机枪兵,试探性的发动进攻;然而,飞狗的机枪兵个数也已经不少了。野猫和飞狗的兵在飞狗的家门口相遇了,于是,便有一场腥风血雨和阵阵惨叫声。由于是在飞狗的家门口,飞狗的兵补给会很快,野猫看敌不过,决定撤退。这时飞狗的兵力也不足够多,所以没追出来。
由于不允许造医生,机枪兵没办法补血。受伤的兵只好忍了。555-
现在,野猫又攒足了足够的兵力,决定发起第二次进攻。为了使这次进攻给狗狗造成更大的打击,野猫决定把现有的兵分成两部分,从两路进攻。由于有些兵在第一次战斗中受伤了,为了使两部分的兵实力平均些,分的规则是这样的:1)两部分兵的个数最多只能差一个;2)每部分兵的血值总和必须要尽可能接近。现在请你编写一个程序,给定野猫现在有的兵的个数以及每个兵的血格值,求出野猫按上述规则分成两部分后每部分兵的血值总和。
输入格式
第一行为一个整数n(1<=n<=200),表示野猫现在有的机枪兵的个数。以下的n行每行一个整数,表示每个机枪兵的血格(1<=ai<=40)。
输出格式
只有一行,包含两个数,即野猫的每部分兵的血值总和,较小的一个值放在前面,两个数用空格分隔。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include<iostream> using namespace std; int n,a[201],sum=0; int f[201][8001],ans,mn=0x7fffffff; int abs(int x){if(x>0)return x;return -x;} int main() { cin>>n; int n2=(n+1)/2; 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=n2;j>=0;j--) for(int v=sum;v>=0;v--) { if(v+a[i]<=sum&&f[j][v]==1)f[j+1][v+a[i]]=1; } for(int i=0;i<=40*n2;i++) { if(f[n2][i]&&abs(sum-i-i)<mn) { mn=abs(sum-i-i); if(i<=sum/2)ans=i; else ans=sum-i; } } cout<<ans<<' '<<sum-ans; return 0; } |
黄巨大。。为什么这道题的样例里面不是分成“38 52”,那样不是血值总和更接近吗?
那个3是。。。n个数
。。。。。。我是傻逼啊= =