题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1171
题意:
连续输入多组数据
n种设备
输入n组数据,每组包括设备的价值v,以及设备的数量m
将这些设备分为两组,使得价值尽可能均分,如果不能均分,A得到的一定要大于B得到的
输出A,B的最终得到的设备价值
解题思路:
多重背包转化为01背包
将所有的设备的数量都变成1,重新存入数组
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int p[5005];
int ans[250005];
int main()
{
int n;
while(~scanf("%d",&n) && n>0)
{
memset(ans,0,sizeof(ans));
int s=0,l=0;
int vi,mi;
for(int i=0;i<n;i++)
{
scanf("%d%d",&vi,&mi);
for(int j=0;j<mi;j++)
{
p[l]=vi;
l++;
s+=vi;
}
}
for(int i=0;i<l;i++)
{
for(int j=s/2;j>=p[i];j--)
{
ans[j] = max(ans[j],ans[j-p[i]]+p[i]);
}
}
printf("%d %d\n",s-ans[s/2],ans[s/2]);
}
return 0;
}