题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5281

二分一个答案比值,因为最后要*1000,不如先把 v[] *1000,就可以二分整数;

枚举 mid ,如果 mid 小于等于 ans ,则 ∑v[i] - mid * ∑w[i] >= 0,可以继续往大调整,为了使答案最大,背包找一下使这个值最大的组合,看看能否 >=0;

数组开 1000 即可... 把 w 大于 1000 的直接当做最大的 w 。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mid ((l+r)>>1)
using namespace std;
typedef long long ll;
int const xn=;
int n,m,ans,w[xn];
ll f[],tmp[xn],v[xn];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return f?ret:-ret;
}
bool ck(int k)
{
for(int i=;i<=n;i++)tmp[i]=v[i]-(ll)w[i]*k;
memset(f,-,sizeof f);//
f[]=;
for(int i=;i<=n;i++)
for(int j=m;j>=;j--)
f[min(m,j+w[i])]=max(f[min(m,j+w[i])],f[j]+tmp[i]);
return f[m]>=;
}
int main()
{
n=rd(); m=rd();
for(int i=;i<=n;i++)w[i]=rd(),v[i]=rd()*;
int l=,r=1e9;
while(l<=r)
{
if(ck(mid))ans=mid,l=mid+;
else r=mid-;
}
printf("%d\n",ans);
return ;
}

最新文章

  1. 如何利用ETW(Event Tracing for Windows)记录日志
  2. UGUI全面实践教程
  3. java 字符串zlib压缩/解压
  4. javascript之基本包装类型(Boolean,Number,String)基础篇
  5. iOS真机调试——申请开发者证书
  6. Java单元测试:@BeforeClass,@Before,@Test,@After,@AfterClass中的问题详解
  7. cursor 属性
  8. 原生js写ajax请求(复习)
  9. 微信小程序-获取经纬度
  10. supergridcontrol记录,分页
  11. 14)django-模板(计数器)
  12. hadoop启动
  13. input框的输入限制
  14. hdu1573 X问题【中国剩余定理】
  15. 算法总结(转自CS-Notes)
  16. learn python the hard way 习题1~5总结
  17. Pamulinawen--IPA--菲律宾伊洛卡诺语
  18. 《JAVA与模式》之访问者模式
  19. 将本地已有项目上传到github
  20. Jenkins插件开发(四)-- 插件发布

热门文章

  1. POJ 2115 C Looooops【数论】
  2. 路由选择(codevs 1062)
  3. CERC 2014 (动态树+主席树)
  4. Separate code and data contexts: an architectural approach to virtual text sharing
  5. msp430项目编程16
  6. 通过分析system_call中断处理过程来深入理解系统调用
  7. jquery serializeArray() 方法通过序列化表单值来创建对象数组(名称和值)。
  8. 关于oracle存储过程的若干问题备忘
  9. css实现文字渐变
  10. canvas仿芝麻信用分仪表盘