poj2576 Tug of War
Topic Meaning:给出n个数从中选a个数构成一组,剩下的b个数为一组,a与b的差值不超过1,求这两组数字总和差值最小时的两组的值。
Method of Solving:二维背包
dp[j][k]表示是否存在一组当其有k个数时,其值为j,以所有数字总和sum/2为第一状态上限,数字个数n/2为第二状态上限进行状态转移即可;
因为当dp[j][k]确定时,必然可知另外一组含n-k个数字,其数字总和为sum-j,结合题目要求可得出答案;
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int f[105],dp[50000][105];
int main(){
int n,sum;
while(cin>>n){
sum=0;
for(int i=1;i<=n;i++) {cin>>f[i];sum+=f[i];}
int mid=sum/2,half=(n+1)/2;
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=mid;j>=f[i];j--)
for(int k=half;k>0;k--)
if(dp[j-f[i]][k-1])
dp[j][k]=1;
int maxl=0,j;
for(j=mid;j>=0;j--)
if(dp[j][half]||dp[j][half-1])
break;
cout<<j<<' '<<sum-j<<endl;
}
return 0;
}

浙公网安备 33010602011771号