这个题我有了一点思路:采用性价比来写:就是将价值和价格相比的值存入数组再升序排序,
显然过不了,那就再搜索,缩小范围搜。
代码如下:
#include<stdio.h>
int a[10000],b[10000],c[10000],d[10000],l[10000],max=-1;
double xjb[10000];
int bj(int k)
{
if(a[k]==k) return k;
return a[k]=bj(a[k]);
}
void dfs(int money1,int jz1,int zj,int sl,int ly)
{
if(money1>zj) return ;
if(jz1>max)
max=jz1;
for(int k=ly+1;k<=sl;k++){
dfs(money1+d[k],jz1+l[k],zj,sl,k);
}
}
int main()
{
int q,w,e;
scanf("%d%d%d",&q,&w,&e);
for(int i=1;i<=q;i++)
a[i]=i;
for(int i=1;i<=q;i++)
scanf("%d%d",&b[i],&c[i]);
for(int i=1;i<=w;i++){
int t,y;
scanf("%d%d",&t,&y);
a[bj(t)]=bj(y);
}
for(int i=1;i<=q;i++){
for(int j=1;j<=q;j++){
if(a[bj(i)]==bj(j)){
d[i]+=b[j];
l[i]+=c[j];
}
}
}
int q1=1;
for(int i=1;i<=q;i++)
{
if(a[i]==i&&d[i]<=e)
{
a[q1]=i;
d[q1]=d[i];
l[q1]=l[i];
q1++;
}
}
for(int i=1;i<q1;i++){
xjb[i]=l[i]/d[i];
}
for(int i=1;i<q1-1;i++){
for(int j=i+1;j<q1;j++){
if(xjb[i]<xjb[j]){
int temp=xjb[i];
xjb[i]=xjb[j];
xjb[j]=temp;
temp=l[i];
l[i]=l[j];
l[j]=temp;
temp=d[i];
d[i]=d[j];
d[j]=temp;
}
}
}
if(q1<20){
for(int i=1;i<q1;i++){
int money=d[i],jz=l[i];
dfs(money,jz,e,q1,i);
}
}
else{
for(int i=1;i<q1/3;i++){
int money=d[i],jz=l[i];
dfs(money,jz,e,q1/3,i);
}
}
// int money=0;
// for(int i=1;i<q1;i++){
// if(money+d[i]<=e){
// money+=d[i];
// max+=l[i];
// }
// }
// for(int i=1;i<q1;i++){
// printf("%d %lf %d %d %d\n",i,xjb[i],a[i],d[i],l[i]);
// }
// if(max!=-1)
// max+=1;
printf("%d",max);
return 0;
}
显然还是超限了。
那么就用01,背包。