5.11
洛谷P2370 yyy2015c01 的 U 盘
接口越大,能传输的文件价值越大。
二分答案即可。
check函数是一个01背包问题。。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,p,s,w[1010],v[1010],f[1010];
bool check(int x) //check接口大小为x时是否能满足p的价值
{
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
{
if(w[i]>x) continue;
for(int j=s;j>=w[i];j--)
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
return f[s]>=p;
}
int main()
{
cin>>n>>p>>s;
for(int i=1;i<=n;i++)
scanf("%d%d",&w[i],&v[i]);
int l=0,r=s;
while(l+1<r)
{
int mid=(l+r)/2;
if(check(mid))
r=mid;
else
l=mid;
}
if(check(r))
cout<<r;
else
cout<<"No Solution!";
return 0;
}