Big Event in HDU
http://acm.hdu.edu.cn/showproblem.php?pid=1171
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9052 Accepted Submission(s): 3114
The splitting is absolutely a big event in HDU! At the same time, it is a trouble thing too. All facilities must go halves. First, all facilities are assessed, and two facilities are thought to be same if they have the same value. It is assumed that there is N (0<N<1000) kinds of facilities (different value, different kinds).
A test case starting with a negative integer terminates input and this test case is not to be processed.
2 10 1 20 1 3 10 1 20 2 30 1 -1
20 10 40 40
using namespace std;
int c[250005],temp[250005];
int value[55],amount[55];
int main(){
int n,i,j,k,sum;
while(scanf("%d",&n)!=EOF && n>0){
memset(value,0,sizeof(value));
memset(amount,0,sizeof(amount));
memset(c,0,sizeof(c));
memset(temp,0,sizeof(temp));
sum=0; //总价值
for( i=1;i<=n;i++){
scanf("%d%d",&value[i],&amount[i]);
sum+=value[i]*amount[i];
}
for(i=0;i<=value[1]*amount[1];i+=value[1])
c[i]=1; //amount[1]件物品(单件价值为value[1])所能表达的值为i
int len=value[1]*amount[1];
for(i=2;i<=n;i++){
for(j=0;j<=len;j++) //前一个表达式
for(k=0;k<=value[i]*amount[i];k+=value[i]) //后一个表达式
temp[j+k]+=c[j];
len+=value[i]*amount[i]; //注意要变化长度
for( j=0;j<=len;j++){
c[j]=temp[j];
temp[j]=0;
}
}
for(i=sum/2;i>=0;i--)
if(c[i]!=0){
printf("%d %d\n",sum-i,i);
break;
}
}
return 0;
}
//把总价值一开始分成相等的两份,想象成是背包的体积(背包是不断的把体积分给物品),
//这里就是把其中的一份中的一件物品的价值不断的分到另一份中去,用背包来解
#include<iostream>
#include<cstring>
using namespace std;
int value[5005],bag[250005];
int main(){
int num,sum,n,m,k;
while(scanf("%d",&n)!=EOF && n>=0){
num=sum=0;
memset(bag,0,sizeof(bag));
for(int i=1;i<=n;i++){
scanf("%d%d",&m,&k);
for(int j=1;j<=k;j++)
value[++num]=m; //把所有的物品的价值存储起来
sum=sum+m*k;
}
for(int i=1;i<=num;i++) //num个物品
for(int j=sum/2;j>=value[i];j--)//j表示其中一份剩余的价值 ,这里sum/2就相当于总体积
bag[j]=max(bag[j],bag[j-value[i]]+value[i]); //把物品i不分或者分走
printf("%d %d\n",max(bag[sum/2],sum-bag[sum/2]),min(bag[sum/2],sum-bag[sum/2]));
}
// system("pause");
return 0;
}