01分数规划+背包
t[i]读入时*1000,不用小数而满足题目要求
由于W比较小而w[i]很大,枚举W
当w[i]>W 时必满足,所以直接使w[i]>W的贡献算在f[W]上
求Σt[i]/Σw[i]的最大值,ans=Σt[i]/Σw[i],即Σ(t[i]-w[i]*ans)
二分ans然后正常01背包
// // main.cpp // Luogu // // Created by gengyf on 2019/7/7. // Copyright © 2019 yifan Geng. All rights reserved. // #include <bits/stdc++.h> using namespace std; int n,W; int w[300],t[300]; long long f[10005]; bool check(int x){ memset(f,128,sizeof(f)); f[0]=0; long long tmp=f[W]; for(int i=1;i<=n;i++) for(int j=W;j>=0;j--){ if(f[j]!=tmp){ int y=j+w[i]; y=min(y,W); f[y]=max(f[y],f[j]+t[i]-(long long)w[i]*x); } } return f[W]>=0; } int main(){ scanf("%d%d",&n,&W); for(int i=1;i<=n;i++){ scanf("%d%d",&w[i],&t[i]); t[i]*=1000; } int l=0,r=1000000; while(l<=r){ int mid=(l+r)>>1; if(check(mid))l=mid+1; else r=mid-1; } printf("%d",l-1); return 0; }