Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101915870
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-05-18 18:06:07

  来源:


  为了理解上述算法,特举以下实例。设有4件物品,它们的重量和价值见表:

  物品 0 1 2 3

  重量 5 3 2 1

  价值 4 4 3 1

  并设限制重量为7。则按以上算法,下图表示找解过程。由图知,一旦一个解,算法就进一步找更好的佳。如能判定某个查找分支不会找到更好的解,算法不会在该分支继续查找,而是立即终止该分支,并去考察下一个分支。

  按上述算法编写函数和程序如下:

  【程序】

以下是引用片段:
  # include
  # define N 100
  double limitW,totV,maxV;
  int option[N],cop[N];
  struct { double weight;
  double value;
  }a[N];
  int n;
  void find(int i,double tw,double tv)
  { int k;
  /*考虑物品i包含在当前方案中的可能性*/
  if (tw+a.weight<=limitW)
  { cop=1;
  if (i
  else
  { for (k=0;k
  option[k]=cop[k];
  maxv=tv;
  }
  cop=0;
  }
  /*考虑物品i不包含在当前方案中的可能性*/
  if (tv-a.value>maxV)
  if (i
  else
  { for (k=0;k
  option[k]=cop[k];
  maxv=tv-a.value;
  }
  }
  void main()
  { int k;
  double w,v;
  printf(“输入物品种数n”);
  scanf((“%d”,&n);
  printf(“输入各物品的重量和价值n”);
  for (totv=0.0,k=0;k
  { scanf(“%1f%1f”,&w,&v);
  a[k].weight=w;
  a[k].value=v;
  totV+=V;
  }
  printf(“输入限制重量n”);
  scanf(“%1f”,&limitV);
  maxv=0.0;
  for (k=0;k find(0,0.0,totV);
  for (k=0;k
  if (option[k]) printf(“%4d”,k+1);
  printf(“n总价值为%.2fn”,maxv);
  }

  作为对比,下面以同样的解题思想,考虑非递归的程序解。为了找解速度,程序不是简单地逐一生成所有候选解,而是从每个物品对候选解的影响来形成值得进一步考虑的候选解,一个候选解是通过依次考察每个物品形成的。对物品i的考察有这样几种情况:当该物品被包含在候选解中依旧满足解的总重量的限制,该物品被包含在候选解中是应该继续考虑的;反之,该物品不应该包括在当前正在形成的候选解中。同样地,仅当物品不被包括在候选解中,还是有可能找到比目前临时最佳解更好的候选解时,才去考虑该物品不被包括在候选解中;反之,该物品不包括在当前候选解中的方案也不应继续考虑。对于任一值得继续考虑的方案,程序就去进一步考虑下一个物品。

  【程序】

以下是引用片段:
  # include
  # define N 100
  double limitW;
  int cop[N];
  struct ele { double weight;
  double value;
  } a[N];
  int k,n;
  struct { int ;
  double tw;
  double tv;
  }twv[N];
  void next(int i,double tw,double tv)
  { twv.=1;
  twv.tw=tw;
  twv.tv=tv;
  }
  double find(struct ele *a,int n)
  { int i,k,f;
  double maxv,tw,tv,totv;
  maxv=0;
  for (totv=0.0,k=0;k
  totv+=a[k].value;
  next(0,0.0,totv);
  i=0;
  While (i>=0)
  { f=twv.;
  tw=twv.tw;
  tv=twv.tv;
  switch(f)
  { case 1: twv.++;
  if (tw+a.weight<=limitW)
  if (i
  { next(i+1,tw+a.weight,tv);
  i++;
  }
  else
  { maxv=tv;
  for (k=0;k
  cop[k]=twv[k].!=0;
  }
  break;
  case 0: i--;
  break;
  default: twv.=0;
  if (tv-a.value>maxv)
  if (i
  { next(i+1,tw,tv-a.value);
  i++;
  }
  else
  { maxv=tv-a.value;
  for (k=0;k
  cop[k]=twv[k].!=0;
  }
  break;
  }
  }
  return maxv;
  }
  void main()
  { double maxv;
  printf(“输入物品种数n”);
  scanf((“%d”,&n);
  printf(“输入限制重量n”);
  scanf(“%1f”,&limitW);
  printf(“输入各物品的重量和价值n”);
  for (k=0;k
  scanf(“%1f%1f”,&a[k].weight,&a[k].value);
  maxv=find(a,n);
  printf(“n选中的物品为n”);
  for (k=0;k
  if (option[k]) printf(“%4d”,k+1);
  printf(“n总价值为%.2fn”,maxv);
  }

 

阅读(381) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~