输入:
5 10
2 6
2 3
6 5
5 4
4 6
输出:
15
重要的是剪枝。 感谢x同学。
上界是给“不拿”用的。 如果不拿的再加上上界的值小于当前最优值,就return。(没有搞头了)
#include<bits/stdc++.h>
using namespace std;
struct node
{
int w,v;
double dj;
}a[105];
int n,c;
bool cmp1(node a,node b)
{
if(a.v!=b.v) return a.v>b.v;
else return a.w<b.w;
}
bool cmp2(node a,node b)
{
return a.dj>b.dj;
}
int bound(int u,int cc)
{
node b[105];
int j=0;
for(int i=u;i<=n;i++)
{
b[j++]=a[i];
}
sort(b,b+j,cmp2);
int anss=0;
for(int i=0;i<j;i++)
{
if(cc>=b[i].w)
{
anss+=b[i].v;
cc-=b[i].w;
}
else
{
anss+=(b[i].dj*cc);
cc=0;break;
}
}
return anss;
}
int ans=-1;
void dfs(int u,int sum,int cc)
{
if(u>n) ans=max(ans,sum);
else
{
if(cc-a[u].w>=0) dfs(u+1,sum+a[u].v,cc-a[u].w);
int bou=bound(u,cc);
if(bou+sum>ans) dfs(u+1,sum,cc);
}
}
int main()
{
cin>>n>>c;
for(int i=1;i<=n;i++)
{
int w,v; double dj;
cin>>w>>v;
dj=v*1.0/w;
a[i]={w,v,dj};
}
dfs(1,0,c);
cout<<ans;
return 0;
}
|