传送门:HDU-1171 Big Event in HDU
分析:题目要求将设备分家,并且两家值必须尽可能接近,而且第一家必须大于第二家。
经典01背包问题,算是我对背包问题的入门。
思路:将同种价值而数量多的物品拆分出来,把所有物品看做一个背包,总价值的一半为容量,而每个的价值为重量。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main(){
int n,v[100000],dp[100000],k; //用v[ ]这个数组将所有物品价值存起来(注意同种价值多个的也要存)
while(cin>>n&&n>=0){
int h=1,sum=0,total=0; //sum是价值总数,而total是物品总数
for(int i=0;i<n;i++){
cin>>v[h]>>k;
sum+=k*v[h];
total+=k;
int temp=v[h];
for(int j=1;j<=k;j++){
v[h]=temp;
h++;
}
}
int sum1=sum/2; //容量分半可能会有损失,但是不影响
memset(dp,0,sizeof(dp));
for(int i=1;i<=total;i++) //01背包
for(int j=sum1;j>=v[i];j--){
dp[j]=max(dp[j],dp[j-v[i]]+v[i]);
}
cout<<(sum-dp[sum1])<<" "<<dp[sum1]<<endl;
}
}