@Chilling
2016-08-19T10:12:02.000000Z
字数 782
阅读 1427
DP
Description
相传人族与兽族对峙了很久,双方均受到了重创,兽族趁人类没有能力发起大规模进攻之时突然袭击,想一次彻底打败人族。人类为了生存,无论老幼伤病,全部参战,兵分两路抗敌。
由于体质不同,我们以血量表示一个人的战斗力,现在给你所有人的血量,请你把人类分成战斗力最接近的两部分。注意,战斗力要最接近,不然,人族会因你而战败呦!
Input
第一行为一个整数n(1<=n<=36),表示人族的总人数。以下的n行每行一个整数,表示一个人的血量mi(即战斗力),其中1<=mi<=400.
Output
只有一行,包含两个数,即人族的每部分兵的血量总和,较小的一个值放在前面,两个数用空格分隔。
Sample Input
3
20
32
35
Sample Output
35 52
分析:总人数除以二得到平均的一半,这就是背包总容量,再将战斗力尽量装进去……
解释的好烂啊反正就是这样,其实就是01背包
#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;int main(){int n,a[1000],i,sum,mid,j,d[1000];while(scanf("%d",&n)!=EOF){sum=0;memset(d,0,sizeof(d));memset(a,0,sizeof(a));for(i=1;i<=n;i++){scanf("%d",&a[i]);sum+=a[i];}mid=sum/2;for(i=1;i<=n;i++){for(j=mid;j>=a[i];j--)d[j]=max(d[j-a[i]]+a[i],d[j]);}printf("%d %d\n",d[mid],sum-d[mid]);}return 0;}
