當前位置:歷史故事大全網 - 故事大全 - C语言 背包问题 递归算法

C语言 背包问题 递归算法

提问者的这个程序中用了循环算法,不过逻辑上有一个小bug,就是在判断到n==0时,如果还有容量,那么返回的应该是第一个物品的重量而不是0。你可以改变容量C或项目参数来检验算法的逻辑正确性。

关于选择输出的,我加了一个队列,用于标记选择的项目。因为完成了所有电位后只有最外层的标记是有效的,所以最后用了一个来循环来完成各层的标记。下面是后面的程序:

int?a[5]={0};

int?MaxW(int?n,?int?C,?int?*体积,?int?*重量)

{

int?W= 0,W1=0,W2=0;

if?(n?==?0)

{

if(C?gt;=? Volunme[0])

{

a[0]=1;

返回?W=1;

}

else

return?0;

}

else?if(C?gt;=?Volunme[n])//背包剩余空间可以放下物品n

{

W1?=?MaxW(n-1,?C-Volunme[n],Volunme,Weight)? ?Weight[n];?//容纳n所能获得的重量

W2?=?MaxW(n-1,C,Volunme,Weight);?//不放n所能获得的重量的重量

W=(W1gt;W2?W1:W2);

a[n]=(W1gt;W2?1:0);

}

else//背包空间放不下n,返回判断放n-1的情况

{

return?MaxW(n-1,C,体积,重量);

}

返回?W;

}

int?main(void)

{

int?n=5;int?C=7;

int?Volunme[]?=?{1,2,3,4,5};

int?Weight[]?=?{1,2,5,7,8};

printf("最大重量为d\n",MaxW(n-1, C,体积,重量));

for(int?i=n-2;igt;=0;i--)

{

a [i]=0;

if(a[i 1]==1)

{

C-=Volunme[i 1];

重量[i 1]=0;

}

MaxW(i,C,体积,重量);

}

printf("选择的项目号是:");

for(int?i=0;ilt;5;i )

{

if(a[i]==1)

printf("#d",i 1);

}

printf("\n ");

返回?0;

}

  • 上一篇:一种“新”型的信用证纠纷解决方式
  • 下一篇:个人日志
  • copyright 2024歷史故事大全網