以你的意思, 就是不管什么情况都 执行cop[i]=0;了,做如下改动把cop[i]=0;放到后面
void find(int i,double tw,double tv)
{
int k;
printf("find(%d,%f,%f)\n",i,tw,tv);
if(tw+a[i].weight<=limitW)
{
cop[i]=1;
if(i<n-1)
find(i+1,tw+a[i].weight,tv);
else
{
for(k=0;k<n;k++)
option[k]=cop[k];
maxv=tv;
}
printf(“&&&”);
}
if(tv-a[i].value>maxv)
if(i<n-1)
find(i+1,tw,tv-a[i].value);
else
{
for(k=0;k<n;k++)
option[k]=cop[k];
maxv=tv-a[i].value;
printf("!!!");
}
cop[i]=0;
}
void find(int i,double tw,double tv)
{
int k;
printf("find(%d,%f,%f)\n",i,tw,tv);
if(tw+a[i].weight<=limitW)
{
cop[i]=1;
if(i<n-1)
find(i+1,tw+a[i].weight,tv);
else
{
for(k=0;k<n;k++)
option[k]=cop[k];
maxv=tv;
}
printf(“&&&”);
}
if(tv-a[i].value>maxv)
if(i<n-1)
find(i+1,tw,tv-a[i].value);
else
{
for(k=0;k<n;k++)
option[k]=cop[k];
maxv=tv-a[i].value;
printf("!!!");
}
cop[i]=0;
}
{
int k;
printf("find(%d,%f,%f)\n",i,tw,tv);
if(tw+a[i].weight<=limitW)
{
cop[i]=1;
if(i<n-1)
find(i+1,tw+a[i].weight,tv);
else
{
for(k=0;k<n;k++)
option[k]=cop[k];
maxv=tv;
}
printf(“&&&”);
}
else
cop[i]=0; if(tv-a[i].value>maxv)
{ if(i<n-1)
find(i+1,tw,tv-a[i].value);
else
{
for(k=0;k<n;k++)
option[k]=cop[k];
maxv=tv-a[i].value;
printf("!!!");
}
}
else
cop[i]=0;
}
....
if(i<n-1)//设此处满足条件则再调用find()一次(第二次调用)
find(i+1,tw+a[i].weight,tv); // 这里作个标记就叫1#标记吧,后面要用
else
{
for(k=0;k<n;k++)
option[k]=cop[k];
maxv=tv;
}
cop[i]=0;
.... 再来看看第二次调用find()的情况吧: find(1,7.0,totv) //1=0+1,而7.0是假设的值
....
if(tw+a[i].weight<=limitW)//设此处不满足条件则不执行其内的语句
{
...
}
if(tv-a[i].value>maxv)//设此处满足条件,则要执行到你说的那段里
{
if(i<n-1)//设此处不满足条件则不执行其内的find调用语句
find(i+1,tw,tv-a[i].value);
else //上面的不执行则就该执行else语句段
{
for(k=0;k<n;k++)
option[k]=cop[k];
maxv=tv-a[i].value;
printf("!!!");
}
/*关键:当执行完这个else后第二次的find()调用也就执行完了,作为一个函数它应该返回调用处了,当然也就是返回前面作为1#标记的地方,然后这第一次调用是在if里,当if执行完后程序继续向下但不会执行else里的语句,而是执行后面的那句话: cop[i]=0; printf(“&&&”);*/
以上的情况就是你说的那种情况:在执行完if(tv-a[i].value>maxv)那一段以后,马上就能跳到cop[i]=0;在用递归调用时一定要清楚在函数调用结束后该返回到哪儿继续执行,应该很清楚了吧! :(
我还想问一句,为什么在执行完输出!!!之后返回到上边时,i的值会减少1?
对了,我马上开一贴,先给你100分:)