poj2576 Tug of War(二维费用背包)

来源:互联网 发布:fade to black知乎 编辑:程序博客网 时间:2024/06/10 18:04

题目链接:poj2576

题目大意:有n个人,给出他们的体重,将他们分为两队,尽量均分,而且相差人数不能超过一个人。

输出两队的体重,小的在前。

思路:二维费用背包   有两个限制因素,人数和体重

#include<stdio.h>#include<string.h>#include<iostream>using namespace std;int dp[45010][120];int w[120];int main(){int n;while(~scanf("%d",&n)){int sum=0;for(int i=0;i<n;i++){scanf("%d",&w[i]);sum+=w[i];}int mid=sum/2;int half=(n+1)/2;memset(dp,0,sizeof dp);dp[0][0]=1;for(int i=0;i<n;i++)for(int j=mid;j>=w[i];j--)for(int k=half;k>0;k--)if(dp[j-w[i]][k-1])dp[j][k]=1;for(int i=mid;i>=0;i--)if(dp[i][half]||dp[i][half-1]){printf("%d %d\n",i,sum-i);break;}}    return 0;}