HDU 1171 Big Event in HDU 多重背包 .
2016-09-25 18:05
387 查看
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1171
就是把总价值分成一半,求最多能放多少
多重背包代码:842MS
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f;
int v[50+5],n[50+5];
bool d[250000+5];
//d[i] 表示i空间内 能否放到
int main()
{
int N;
while(cin>>N,N>=0)
{
int sum=0,half;
for(int i=1;i<=N;i++){
scanf("%d%d",&v[i],&n[i]);
sum+=v[i]*n[i];
}
half=sum/2;
int ans=0;
memset(d,false,sizeof(d)); d[0]=true;
for(int i=1;i<=N;i++)
for(int j=0;j<n[i];j++)
for(int k=half;k>=v[i];k--)
if(d[k-v[i]]) d[k]=true,ans=max(ans,k);
cout<<sum-ans<<' '<<ans<<endl;
}
return 0;
}
转01背包:TLE
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f;
int V[50+5];
bool d[500000+5];
//d[i] 表示i空间内 能否放到
int main()
{
int N,v,n;
while(cin>>N,N>=0)
{
int sum=0,half,p=0;
for(int i=1;i<=N;i++){
scanf("%d%d",&v,&n);
for(int i=1;i<=n;i++)
V[p++]=v,sum+=v;
}
half=sum/2;
int ans=0;
memset(d,false,sizeof(d)); d[0]=true;
for(int i=0;i<p;i++)
for(int k=half;k>=V[i];k--)
if(d[k-V[i]]) d[k]=true,ans=max(ans,k);
cout<<sum-ans<<' '<<ans<<endl;
}
return 0;
}
多重背包二进制优化:78MS
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f;
int v[50+5],n[50+5];
bool d[250000+5];
//d[i] 表示i空间内 能否放到
int main()
{
int N;
while(cin>>N,N>=0)
{
int sum=0,half;
for(int i=1;i<=N;i++){
scanf("%d%d",&v[i],&n[i]);
sum+=v[i]*n[i];
}
half=sum/2;
int ans=0;
memset(d,false,sizeof(d)); d[0]=true;
for(int i=1;i<=N;i++)
{
int c=n[i],k=1;
while(c>k)
{
for(int j=half;j>=k*v[i];j--)
if(d[j-k*v[i]]) d[j]=true,ans=max(ans,j);
c-=k; k<<=1;
}
for(int j=half;j>=c*v[i];j--)
if(d[j-k*v[i]]) d[j]=true,ans=max(ans,j);
}
cout<<sum-ans<<' '<<ans<<endl;
}
return 0;
}
就是把总价值分成一半,求最多能放多少
多重背包代码:842MS
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f;
int v[50+5],n[50+5];
bool d[250000+5];
//d[i] 表示i空间内 能否放到
int main()
{
int N;
while(cin>>N,N>=0)
{
int sum=0,half;
for(int i=1;i<=N;i++){
scanf("%d%d",&v[i],&n[i]);
sum+=v[i]*n[i];
}
half=sum/2;
int ans=0;
memset(d,false,sizeof(d)); d[0]=true;
for(int i=1;i<=N;i++)
for(int j=0;j<n[i];j++)
for(int k=half;k>=v[i];k--)
if(d[k-v[i]]) d[k]=true,ans=max(ans,k);
cout<<sum-ans<<' '<<ans<<endl;
}
return 0;
}
转01背包:TLE
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f;
int V[50+5];
bool d[500000+5];
//d[i] 表示i空间内 能否放到
int main()
{
int N,v,n;
while(cin>>N,N>=0)
{
int sum=0,half,p=0;
for(int i=1;i<=N;i++){
scanf("%d%d",&v,&n);
for(int i=1;i<=n;i++)
V[p++]=v,sum+=v;
}
half=sum/2;
int ans=0;
memset(d,false,sizeof(d)); d[0]=true;
for(int i=0;i<p;i++)
for(int k=half;k>=V[i];k--)
if(d[k-V[i]]) d[k]=true,ans=max(ans,k);
cout<<sum-ans<<' '<<ans<<endl;
}
return 0;
}
多重背包二进制优化:78MS
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f;
int v[50+5],n[50+5];
bool d[250000+5];
//d[i] 表示i空间内 能否放到
int main()
{
int N;
while(cin>>N,N>=0)
{
int sum=0,half;
for(int i=1;i<=N;i++){
scanf("%d%d",&v[i],&n[i]);
sum+=v[i]*n[i];
}
half=sum/2;
int ans=0;
memset(d,false,sizeof(d)); d[0]=true;
for(int i=1;i<=N;i++)
{
int c=n[i],k=1;
while(c>k)
{
for(int j=half;j>=k*v[i];j--)
if(d[j-k*v[i]]) d[j]=true,ans=max(ans,j);
c-=k; k<<=1;
}
for(int j=half;j>=c*v[i];j--)
if(d[j-k*v[i]]) d[j]=true,ans=max(ans,j);
}
cout<<sum-ans<<' '<<ans<<endl;
}
return 0;
}
相关文章推荐
- EZOI [NOIP模拟赛][线段树]
- Infer 在 Mac 上的安装和环境配置
- 自然原始分工
- 几句话就能让你理解:this、闭包、原型链
- 若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
- 函数指针语法梳理
- hibernate工作原理
- 20145214 《信息安全系统设计基础》第2周学习总结
- GridView
- CSS实现自适应下保持宽高比
- java_反射
- 2498 IncDec Sequence
- 洛谷 P1428 小鱼比可爱
- 【Effective Java】9、使用EnumMap代替序数索引
- hibernate对union查询bug
- 【面经】cvte二面
- Posted和Non-Posted传送方式
- springMVC框架下如何实现移动端接口调用——流程简介篇
- 关于javaweb中简单的跨域问题
- 软工图表