您当前的位置:首页 >> 聚焦 >  >> 
c语言背包问题原理 c语言背包问题 环球聚焦

时间:2023-07-02 09:02:57    来源:互联网


(资料图)

1、提问者的这程序中用了递归算法,不过逻辑上有个小bug,就是在判断到n==0时,如果还有容量,那么返回的应该是第一个物品的重量而不是0。

2、你可以改变容量C或物品参数来检验算法的逻辑正确性。

3、 关于输出选择的物品,我加了一个数组,用来标记选择的物品。

4、因为做完所有递归后只有最外层的标记是有效的,所以最后用了一个for循环来完成各层的标记。

5、下面是改动后的程序:  inta[5]={0};  intMaxW(intn,intC,int*Volunme,int*Weight)  {  intW=0,W1=0,W2=0;  if(n==0)  {  if(C>=Volunme[0])  {  a[0]=1;  returnW=1;  }  else  return0;  }  elseif(C>=Volunme[n])//背包剩余空间可以放下物品n  {  W1=MaxW(n-1,C-Volunme[n],Volunme,Weight)+Weight[n];//放入n所能得到的重量  W2=MaxW(n-1,C,Volunme,Weight);//不放n所能得到的重量  W=(W1>W2?W1:W2);  a[n]=(W1>W2?1:0);  }  else//背包空间放不下n,返回判断放n-1的情况  {  returnMaxW(n-1,C,Volunme,Weight);  }  returnW;  }  intmain(void)  {  intn=5;intC=7;  intVolunme[]={1,2,3,4,5};  intWeight[]={1,2,5,7,8};  printf("最大重量为%d",MaxW(n-1,C,Volunme,Weight));    for(inti=n-2;i>=0;i--)  {  a[i]=0;  if(a[i+1]==1)  {  C-=Volunme[i+1];  Weight[i+1]=0;  }  MaxW(i,C,Volunme,Weight);  }  printf("选择的物品号是:");  for(inti=0;i<5;i++)  {  if(a[i]==1)  printf("#%d",i+1);  }  printf("");  return0;  }if(n==0)应该改成if(n<0)才对,表示没有物品可选了。

6、我的一个改进,但输出选择项还是有问题!#include#include#defineN3intMaxW(intn,intC,int*Volume,int*Weight,int*Select){intW=0,W1=0;if(n<0){//没有物品了return0;}W=MaxW(n-1,C,Volume,Weight,Select);//没放入n之前的重量if(C>=Volume[n]){//背包剩余空间可以放下物品nW1=MaxW(n-1,C-Volume[n],Volume,Weight,Select)+Weight[n];//放入n所能得到的重量Select[n]=0;if(W1>W){//放入n能获得更大的重量Select[n]=1;W=W1;}}returnW;}intmain(){intC=8,W,i;//intVolume[N]={1,2,3,4,5};//物品体积//intWeight[N]={1,2,5,7,8};//物品重量intVolume[N]={2,3,5};//物品体积intWeight[N]={5,8,7};//物品重量intSelect[N]={0};//选择标记W=MaxW(N-1,C,Volume,Weight,Select);printf("MaxWeight=%d,SelectList[index(volume,weight)]:",W);for(i=0;i

本文到此分享完毕,希望对大家有所帮助。

标签:

热门推荐

X 关闭

X 关闭