您的位置:首页 > 其它

HDU1171

2015-05-31 12:16 183 查看
以sum/2为总容量的0-1背包

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
int li[5010],dp[250005];
int main(){
int n;
while(cin>>n){
if(n<0)
break;
int num=0,sum=0;
for(int i=0;i<n;i++){
int a,b;
cin>>a>>b;
for(int k=0;k<b;k++){
li[num++]=a;
}
sum+=a*b;
}
memset(dp,0,sizeof(dp));
for(int i=0;i<num;i++){
for(int j=sum/2;j>=li[i];j--){
dp[j]=max(dp[j],dp[j-li[i]]+li[i]);
}
}
cout<<max(dp[sum/2],sum-dp[sum/2])<<" "<<min(dp[sum/2],sum-dp[sum/2])<<endl;

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: