注意pd_DFS回溯时,waste-=a[i],要写在a[i]+=b[x];之前,我Debug搞了2个小时,还以为自己二分写错了.应该像这样,
for(int i=1;i<=m;i++)
{
if(a[i]>=b[x])
{
a[i]-=b[x];
if(a[i]<b[1]) waste+=a[i];
if(pd_DFS(x-1,waste,mid)){a[i]+=b[x];return 1;}
if(a[i]<b[1]) waste-=a[i];
a[i]+=b[x];
}
}
而不是
for(int i=1;i<=m;i++)
{
if(a[i]>=b[x])
{
a[i]-=b[x];
if(a[i]<b[1]) waste+=a[i];
if(pd_DFS(x-1,waste,mid)){a[i]+=b[x];return 1;}
a[i]+=b[x];
if(a[i]<b[1]) waste-=a[i];
}
}