注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

fudq's AC Road

何以解忧,唯有AC!

 
 
 

日志

 
 

Codeforces Round #214 (Div. 2) Pro C.Dima and Salad  

2013-11-26 00:39:12|  分类: Codeforces |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http://codeforces.com/contest/366/problem/C
题意:
给n个物品,每个物品有两个参数ai和bi,现在从n个物品里选若干个物品,使得这些物品的sigma(ai)/sigma(bi)=k,k是已知的,问怎么取使得sigma(ai)最大。数据范围最大均为100.
题解:
可以转换成背包问题。把bi乘上k,然后用ai减掉,这样每个物品的体积就是ai-bi*k,价值就是ai。从里面选若干个物品,使得体积和为0。要注意的是,物品的体积范围在-10000到10000之间,体积可能为负,所以可以把包想象成0到20000的体积,目标价值只要看体积为10000的即可。

#define N 10000

int n,k,a;
int v[110],w[110];
int f[N*2+10];

void solve()
{
for(int i=0;i<n;i++)
scanf("%d",&v[i]);
for(int i=0;i<n;i++)
{
scanf("%d",&a);
w[i]=v[i]-k*a;
}
memset(f,-1,sizeof(f));
f[N]=0;
for(int i=0;i<n;i++)
{
if(w[i] >= 0)
{
for(int j=N*2;j>=w[i];j--)
if(f[j-w[i]] != -1)
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
else
{
for(int j=0;j-w[i] <= N*2;j++)
if(f[j-w[i]] != -1)
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
}
if(f[N] == 0)
f[N]=-1;
printf("%d\n",f[N]);
}

int main()
{
#ifndef ONLINE_JUDGE
freopen("testin.txt", "r", stdin);
//freopen("textout.txt", "w", stdout);
#endif
while(scanf("%d%d",&n,&k)!=EOF)
solve();
return 0;
}


  评论这张
 
阅读(87)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017