Big Event in HDU
大略题意:
Hdu的计算机系曾分为计算机学院和软件学院,故原来学院的公共设施要尽可能均分给这两个新的学院,要求计算机学院分得的设施不能少于软件学院的
输入:
第一行为数据个数
第二行为设施的价值 此类设施的个数
-1结束
输出:
两学院分别得到的设施的价值量
思路:
1. 不看网上大神们的解题报告的话,我不会想到这是背包问题的,本来以为是一道巨简单的求平均值,后来越想越不对,在不能均分设施的情况下,用平均值无法实现两学院得到的数据尽可能相近。
2. 其实这是多重背包,背包容量为设施总价值的一半,尽可能让背包里的价值接近于总价值的一半,本程序把它水成了01背包。。
3. 我看有些人的程序里有取最大值最小值的函数,其实没必要.运行一遍01背包后得出的值是接近于设备价值一半的最大价值,故总价值减去它就是略大于一半价值,就是计算机学院的设备价值.
4.哪位大神能告诉我,while语句中变为这样为啥就worry answer了。。。。while(scanf(“%d”),&t&&t!=-1)
#include<stdio.h>
#include<iostream>
using namespace std;
int max(int a,int b)
{
if(a>b)
return a;
return b;
}
void main()
{
int t,a,b,i,j=0;//a:价值b:a的数量
int v[5001];
int val[250001];
while(scanf("%d",&t)!=EOF)
{
int sum=0,c=0;
if(t<0)
break;
memset(v,0,sizeof(v));
memset(val,0,sizeof(val));
for(i=0;i<t;i++)
{
scanf("%d %d",&a,&b);
while(b--)
{
v[c++]=a;
sum=sum+a;
}
}
for(i=0;i<c;i++)//经典01背包
for(j=sum/2;j>=v[i];j--)
val[j]=max(val[j],val[j-v[i]]+v[i]);
printf("%d %d\n",sum-val[sum/2],val[sum/2]);
}
}