luogu P2370 yyy2015c01 的 U 盘
题面传送门
可以发现大小具有单调性,所以可以二分。
二分后用\(01\)背包验证可行性即可。
代码实现:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
int n,m,k,x,y,z,f[1039],l,r,mid,ans;
struct yyy{int x,y;}s[1039];
inline bool cmp(yyy x,yyy y){return x.x<y.x;}
int main(){
register int i,j;
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=n;i++) scanf("%d%d",&s[i].x,&s[i].y),ans=max(ans,s[i].x);
sort(s+1,s+n+1,cmp);
l=0;r=ans+1;
while(l+1<r){
mid=(l+r)>>1;
memset(f,0,sizeof(f));
for(i=1;i<=n;i++){
if(s[i].x>mid) break;
for(j=k;j>=s[i].x;j--) f[j]=max(f[j],f[j-s[i].x]+s[i].y);
}
if(f[k]<m) l=mid;
else r=mid;
//printf("%d %d\n",mid,f[k]);
}
if(r==ans+1) printf("No Solution!");
else printf("%d\n",r);
}