拔河要把人分成两拨人数最多只能相差一个,体重总和最相近。这个题在poj和uva上都有,只是uva上有多组输入,poj上只有一种,在poj上过了,但是在uva 上re,不知道怎么回事。
#include<stdio.h>
#include<string.h>
int dp[45110][115];
int w[105];
int main()
{
int i,j,k,l,m,n,sum,r;
scanf("%d",&m);
while(m--)
{
scanf("%d",&n);
sum=0;
if(n%2==0)
r=n/2;
else
r=n/2+1;
for(i=0;i<n;i++)
{
scanf("%d",&w[i]);
sum+=w[i];
}
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(i=0;i<n;i++)
{
for(j=sum/2+1;j>w[i];j--)
{
for(k=r;k>0;k--)
{
if(dp[j-w[i]][k-1]==1)
dp[j][k]=1;
}
}
}
for(i=sum/2;i>=0;i--)
{
if(n%2==0)
{
if(dp[i][r]==1)
break;
}
else
{
if(dp[i][r]==1||dp[i][r-1]==1)
break;
}
}
printf("%d %d\n",i,sum-i);
}
return 0;
}