CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

最优下料算法

楼主tazhch(鸭)2005-06-03 16:37:08 在 C/C++ / C++ 语言 提问

有一支长度为910(可变)的木材A,而需要一批长度分别40   ,25,30,20....(这一组数据可增,可减,变化的,并且保证每一种至少存在一支)的木材,请教各位高手怎么样写这个算法?吗,  
  email:tzshu@21cn.com  
   
  QQ:306124219 问题点数:100、回复次数:19Top

1 楼nasi00(莫傲·逍遥)回复于 2005-06-04 03:05:32 得分 0

你是要把大的截成小的?  
   
  具体说说看啊Top

2 楼WoodJohn(天在下雨,云在哭泣)回复于 2005-06-04 08:42:54 得分 0

不是吧,往这儿一丢就不管了?!Top

3 楼languagec(各有所求)回复于 2005-06-04 08:44:48 得分 0

回溯就可以了Top

4 楼tazhch(鸭)回复于 2005-06-04 11:42:22 得分 0

就是把大块的分割成不同的不块,让它的余料最少Top

5 楼languagec(各有所求)回复于 2005-06-04 14:33:27 得分 0

#include   <iostream.h>  
  #include   <string.h>  
   
  int   data[]={40,25,30,20};  
  int   N=4,total=910;  
   
  int   stack[100],top;  
  int   temp[100],len;  
  int   min;  
   
  void   print()  
  {  
  int   i;  
  for(i=0;i<len;i++)  
  cout<<temp[i]<<"   ";  
  cout<<endl;  
  }  
   
  int   Sum()  
  {  
  int   i;  
  int   sum=0;  
  for(i=0;i<top;i++)  
  sum=sum+data[i]*stack[i];  
  return   sum;  
  }  
   
  void   Trackback(int   deep)  
  {  
  int   i;  
  if(deep>=N)  
  {  
  if(total-Sum()   <   min)  
  {  
  min=total-Sum();  
  memcpy(temp,stack,sizeof(int)*top);  
  len=top;  
  }  
  return   ;  
  }  
  for(i=1;i<=total/data[deep];i++)  
  {  
  stack[top++]=i;  
  if(Sum()>total)  
  {  
  top--;  
  return;  
  }  
  Trackback(i+1);  
  top--;  
  }  
  }  
   
  int   main()  
  {  
  top=0;  
  min=total;  
  Trackback(0);  
  print();  
  cout<<"min="<<min<<endl;  
  return   0;  
  }  
   
  输出的是各块料的块数     和   至少要剩的料  
  Top

6 楼languagec(各有所求)回复于 2005-06-04 14:35:15 得分 0

给出的只是其中一种方案Top

7 楼mostideal(三甲)回复于 2005-06-04 15:27:11 得分 0

学习。。Top

8 楼tazhch(鸭)回复于 2005-06-08 11:10:49 得分 0

languagec(各有所求.往前走,别回头)   谢谢你!我先改写成delphi试一试Top

9 楼tazhch(鸭)回复于 2005-06-08 17:35:04 得分 0

To   languagec(各有所求.往前走,别回头)    
   
  我需要的是最优的一种,也就是剩余边料最少的一种Top

10 楼lsqlebai(乐百)回复于 2005-06-08 17:36:23 得分 0

用贪心算法试试,应该可以的Top

11 楼zdy_8212(zdy_8212)回复于 2005-06-08 18:18:04 得分 0

有点像邮局算法。用图来解Top

12 楼heguosheng(何国胜)回复于 2005-06-08 23:39:30 得分 0

markTop

13 楼junnyfeng(风歌)回复于 2005-06-08 23:45:40 得分 0

xxTop

14 楼ghghy(风)回复于 2005-06-09 00:49:41 得分 0

有难度,学习Top

15 楼tazhch(鸭)回复于 2005-06-09 08:40:11 得分 0

to     languagec(各有所求.往前走,别回头):  
   
  你的算法基本上可以解决问题,不过经过我的调试:当total=917时出现的结果分别为2,1和27,为何不是四个结果?  
  当total=231是,data[]={35,25,30,20}时出现的结果分别为:2,1,2,2和9.为何不是四个结果,而变成五个结果呢?  
   
  还有能显示前面的多个结果(比如:前10个最优结果),因为现在只能显示一个,而我想要多个结果作比较Top

16 楼languagec(各有所求)回复于 2005-06-10 19:48:28 得分 0

哦   这个程序我贴上来之后发现不对了,当时没时间改,等一下再贴出来  
  Top

17 楼languagec(各有所求)回复于 2005-06-10 20:07:05 得分 100

#include   <iostream.h>  
  #include   <string.h>  
   
  int   data[]={40,25,30,20};  
  int   N=4,total=917;  
   
  int   stack[100],top;  
  int   temp[100],len;  
  int   min;  
   
  void   print()  
  {  
  int   i;  
  for(i=0;i<len;i++)  
  cout<<temp[i]<<"   ";  
  cout<<endl;  
  }  
   
  int   Sum()  
  {  
  int   i;  
  int   sum=0;  
  for(i=0;i<top;i++)  
  sum=sum+data[i]*stack[i];  
  return   sum;  
  }  
   
  void   Trackback(int   deep)  
  {  
  int   i;  
  if(deep>=N)  
  {  
  if(total-Sum()   <   min   &&   top==N)  
  {  
  min=total-Sum();  
  memcpy(temp,stack,sizeof(int)*top);  
  len=top;  
  }  
  return   ;  
  }  
  for(i=1;i<=total/data[deep];i++)  
  {  
  stack[top++]=i;  
  if(Sum()>total)  
  {  
  top--;  
  return;  
  }  
  Trackback(i+1);  
  top--;  
  }  
  }  
   
  int   main()  
  {  
  top=0;  
  min=total;  
  Trackback(0);  
  print();  
  cout<<"min="<<min<<endl;  
  return   0;  
  }  
   
   
  加了一个限制条件,只不过程序比较慢  
  Top

18 楼languagec(各有所求)回复于 2005-06-10 20:09:59 得分 0

还有能显示前面的多个结果(比如:前10个最优结果)  
  -----------------------------------  
  这个的话只要把中间的计算结果保存下来,排个序就可以了,用插入排序,只保留前10个  
   
  Top

19 楼arden1019(CSCUM)回复于 2005-06-10 20:45:31 得分 0

动态规划吧!这种问题还是需要递归解决思路比较清楚Top

相关问题

  • 海晴 请教开料算法
  • 关于裁料算法的优化
  • 寻目录下文件的最优快速搜索算法!!!!
  • 征集最优方法!
  • 求一最优算法
  • 求一最优算法
  • 大家近来讨论一下这个问题,给个最优的方法
  • 最优逼近算法紧急求助!!!
  • 最优算法问题(200分)
  • 证明这个算法最优

关键词

  • top
  • trackback
  • total
  • min
  • print
  • include

得分解答快速导航

  • 帖主:tazhch
  • languagec

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo