HDU 1171 Big Event in HDU
2016-05-07 16:40
330 查看
链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1171
分电脑,要求A组与B组价值尽量地接近(相等),无法相等时A要大于B
记录总价值,遇到多个同一物品拆开
单独将B拿出来做背包,令B的容量为 总价值/2,A最后只需用 总价值-B 即可
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int val[5005],dp[250001];
int main()
{
int n,v,m;
while(cin>>n,n>=0)
{
memset(dp,0,sizeof(dp));
memset(val,0,sizeof(val));
int k=0,sum=0;
for(int i=0; i<n; i++)
{
cin>>v>>m;
while(m--) //拆开多个同一物品
{
val[k++]=v;
sum+=v; //总价值
}
}
for(int i=0;i<k;i++) //01背包
for(int j=sum/2;j>=val[i];j--)
dp[j]=max(dp[j],dp[j-val[i]]+val[i]);
cout<<sum-dp[sum/2]<<" "<<dp[sum/2]<<endl;
}
return 0;
}
分电脑,要求A组与B组价值尽量地接近(相等),无法相等时A要大于B
记录总价值,遇到多个同一物品拆开
单独将B拿出来做背包,令B的容量为 总价值/2,A最后只需用 总价值-B 即可
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int val[5005],dp[250001];
int main()
{
int n,v,m;
while(cin>>n,n>=0)
{
memset(dp,0,sizeof(dp));
memset(val,0,sizeof(val));
int k=0,sum=0;
for(int i=0; i<n; i++)
{
cin>>v>>m;
while(m--) //拆开多个同一物品
{
val[k++]=v;
sum+=v; //总价值
}
}
for(int i=0;i<k;i++) //01背包
for(int j=sum/2;j>=val[i];j--)
dp[j]=max(dp[j],dp[j-val[i]]+val[i]);
cout<<sum-dp[sum/2]<<" "<<dp[sum/2]<<endl;
}
return 0;
}
相关文章推荐
- hdu 1203 I NEED A OFFER! 01背包
- poj 1159 Palindrome dp 字符串
- 我该如何向我的朋友解释“01背包”问题?
- 01背包问题
- hdu 2546 饭卡 (01背包)
- hdu 2602 Bone Collector (01背包 )
- hdu 2639 Bone Collector II (01背包,第k优解问题)
- [01背包]NOIP2001 PJ T4 装箱问题
- [01背包]NOIP 2005 PJ T3 采药 + 01背包的空间优化
- 01背包问题
- 01背包详解(ZeroOnePack)
- XX采药
- poj_1837
- Bone Collector II
- nyoj289苹果
- nyoj开心的小明
- 背包问题1:01背包
- HDU 2602 Bone Collector
- hdu1203 — I NEED A OFFER! (01背包)
- hdu2602 — Bone Collector