题目大意:hdu计算机学院分离为2部分,所有设施也应该要分为2部分,求在尽可能的分成相等的2部分,A部分不小于B部分的前提下价值A和价值B..所有设施给出的模式是: 每类设施有m件,同一类的设施价值相同.
思路:多重背包问题,转化为01背包解决,更加高效的方法can't code and know noting...不过时间效率是O(V*Σlog[num[i]]),not in this O(V*Σnum[i]);
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int value[55],num[55];
int dp[125000];
int main()
{
int n;
while(scanf("%d",&n)!=EOF,n>=0)
{
int sum=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&value[i],&num[i]);
sum+=value[i]*num[i];
}
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
for(int j=0;j<num[i];j++)
{
for(int k=sum/2;k>=value[i];k--)
{
dp[k]=max(dp[k],dp[k-value[i]]+value[i]);
}
}
printf("%d %d\n",sum-dp[sum/2],dp[sum/2]);
}
return 0;
}