hdu 1171(Big Event in HDU) (dp)
Problem Link adress:http://acm.hdu.edu.cn/showproblem.php?pid=1171
Problem analysis:
本题可以转换为多重背包问题。DP算法的最大特点就是计算最优解。
题目大意:计算机学院要分成计算机学院和软件学院,即这两个新的学院要“分家”,要求尽可能的公平,即两家学院分的的财产尽可能的接近,如果实在无法保证相等的话,计算机学院分的的财产不能少于软件学院的。
可以以财产的总和的一半为背包,求的背包最大值。
因为每件物品可以有很多件,所以本题为多重背包问题,可以把多重背包转化为01背包来解决。
#include<iostream> #include<cstring> using namespace std; int dp[200000]; int v[55],n[55]; int max(int a,int b) { return a>b?a:b; } int main() { int t; int i; int sum; while(cin>>t) { if(t<0) break; sum=0; for(i=0;i<t;i++) { cin>>v[i]>>n[i]; sum+=v[i]*n[i]; } memset(dp,0,sizeof(dp)); int j,k; int all=sum; sum/=2; for(i=0;i<t;i++) { for(j=1;j<=n[i];j++) { for(k=sum;k>=v[i];k--) { dp[k]=max(dp[k-v[i]]+v[i],dp[k]); } } } int rest=all-dp[sum]; if(rest>dp[sum]) { swap(rest,dp[sum]); } cout<<dp[sum]<<" "<<rest<<endl; } return 0; }