您的位置:首页 > 其它

HDU1171:Big Event in HDU(多重背包分析)

2014-10-17 21:53 246 查看
通过分析,要使A>=B并且差值最小。所以只要使sum/2的容量下,B最大就Ok了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
#define N 5000000
int dp
;
struct Node{
int v,m;
}num[1005];
bool cmp(Node a,Node b){
return a.v<b.v;
}
int main(void)
{
int n;
int i,j,k;
while(cin>>n&&n>0){
int sum=0;
for(i=1;i<=n;i++){
cin>>num[i].v>>num[i].m;
sum+=num[i].v*num[i].m;
}
sort(num+1,num+1+n,cmp);
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
for(j=1;j<=num[i].m;j++)
for(k=sum/2;k>=num[i].v;k--){
dp[k]=max(dp[k],dp[k-num[i].v]+num[i].v);
}
cout<<sum-dp[sum/2]<<" "<<dp[sum/2]<<endl;

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