HDU 1171 Big Event in HDU(01背包)

时间:2022-07-31 18:45:23

题目链接

题意:给出n个物品的价值v,每个物品有m个,设总价值为sum,求a,b。a+b=sum,且a尽可能接近b,a>=b。

题解:01背包。

#include <bits/stdc++.h>
using namespace std;
int data[],dp[],n,v,m;
int main()
{
while(scanf("%d",&n)&&n>)
{
memset(dp,,sizeof(dp));
int sum=,cnt=;
for(int i=;i<n;i++)
{
scanf("%d%d",&v,&m);
sum+=v*m;
while(m--) data[cnt++]=v;
}
int k=sum/;
for(int i=;i<cnt;i++)//注意不是n
for(int j=k;j>=data[i];j--)
dp[j]=max(dp[j],dp[j-data[i]]+data[i]);
printf("%d %d\n",sum-dp[k],dp[k]);
}
return ;
}