以你的意思, 就是不管什么情况都 执行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;
      
}

解决方案 »

  1.   

    如果要在if(tw+a[i].weight>limitW)或if(tv-a[i].value<=maxv)的情况下才执行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(“&&&”);
          }
                 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;
          
    }
      

  2.   

    满足了你的if 条件当然有可能直接!!!+&&&了
      

  3.   

    我不是在这意思,我的意思是在执行完if(tv-a[i].value>maxv)那一段以后,为什么会能执行到cop[i]=0;那个地方,我用的又不是for循环,我用的是if,怎么会又能执行到那个地方?
      

  4.   

    只因为你用的是递归调用,给你说说递归程序是怎么执行的吧:为了简单假设程序只递归调用两次: 首先看一看第一次调用find的情况(第一次是在main中调用find(0,0.0,totv)) find(0,0.0,totv)
     ....
     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;在用递归调用时一定要清楚在函数调用结束后该返回到哪儿继续执行,应该很清楚了吧!    :(
     
      
                      
                   
      

  5.   

    哈哈,好久都没碰过C了,UP一下吧!!
      

  6.   

    好久没碰C了,UP一下,哈哈!!
      

  7.   

    >> freshboy0913(红绿灯):
      我还想问一句,为什么在执行完输出!!!之后返回到上边时,i的值会减少1?
    对了,我马上开一贴,先给你100分:)