正文

木料问题2005-04-23 07:02:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/goal00001111/691.html

分享到:

/*算法高手请进。有一个难题求解?
标准原材料长600cm。
可能要截成以下几种规格:60cm、80cm、90cm、120cm、150cm、180cm、210cm、240cm的任意几种的组合。
比方说:
方案一:需要60cm28根、210cm16根、240cm8根,最少需要多少根原材料(600cm)
方案....
此解主要解决怎么才能最省料。
另:能否解任意规格尺寸的问题。*/
/*算法;将材料规格按照从大到小的顺序从原材料中取出,这样最省料。
程序不但给出所需的原材料数量,还给出每根原材料剩下的边角余料。
通过改变M,N的值可以改变原材料的预计数量和所需材料的规格*/
/*2005-4-22 梁见斌*/
#include<stdio.h>
#include<stdlib.h>
#define N 8
#define M 100
int Input(void);/*输入材料的规格和数量*/
void sort(int len);/*将材料规格按照从大到小的顺序排列,以便处理*/
void print(int len);/*按顺序打印输入材料的规格和数量*/  
int solve(int len);/*将材料规格按照从大到小的顺序从原材料中取出,这样最省料*/
/*wood[N][2]存储输入材料的规格和数量;source[M]存储原材料的数量;rest存储剩下边角余料*/
int wood[N][2], source[M], rest=0;

int main(void)
{
   int kind, num;
   kind = Input();/*kind表示输入材料规格的种类*/
   sort(kind);
   print(kind);
   num = solve(kind);
   printf("\n至少需要原材料%d根", num);
   printf("\n剩下边角余料总共%d cm,具体的剩余情况为:\n", rest);
   for(int i=0; i<num; i++)
       printf("第%d根剩下%d cm\n", i+1, source[i]);
   system("pause");
   return 0;
}

int Input(void)
{
   int i=0;
   do{
      printf("请输入第 %d 种材料的规格和数量(输入0 0表示结束)", i+1);
      scanf("%d%d", &wood[i][0], &wood[i][1]);
   }  while(wood[i++][0] != 0 && i <= N );
   return i-1;
}      

void sort(int len)
{
   int i, j, max, t;
   for(i=0; i<len-1; i++)/*将材料规格按照从大到小的顺序排列*/
   {
      max = i;
      for(j=i; j<len; j++)
          if(wood[j][0] > wood[max][0])
              max = j;
         if(max != i)
         {
            t = wood[max][0];
            wood[max][0] = wood[i][0];
            wood[i][0] = t;
            t = wood[max][1];
            wood[max][1] = wood[i][1];
            wood[i][1] = t;
         }   
   }   
}

void print(int len)
{
   int i;
   puts("您需要的材料规格和数量如下:");
   for(i=0; i<len; i++)
       printf("规格:%d cm     数量;%d 根\n", wood[i][0], wood[i][1]);
}
   
int solve(int len)
{
   int i=0, j=0, s, m, Flag=0;
   int sum[N]={0}, flag[N]={0};
   for(int i=0; i<100; i++)
       source[i] = 600;   /*每根原材料均长600cm*/
      for(i=0; i<100; i++)
      {
         for(j=0; j<len; j++)/*将材料规格按照从大到小的顺序从原材料中取出,这样最省料*/
         {
            if(flag[j] == 0)/*如果第j种规格的材料数量还不够,继续从原材料中截取*/
            {
               while( source[i] >= wood[j][0] && sum[j] < wood[j][1])
               {
                  source[i] -= wood[j][0];
                  sum[j]++;/*累计第j种规格的材料数量*/
            }
            if(sum[j] == wood[j][1])/*当第j种规格的材料数量足够时,令参数flag[j] = 1*/
                flag[j] = 1;
         }      
      }
      rest += source[i];/*累计边角余料*/
      for( s=0, m=0; m<len; m++)/*累计所有规格的材料数量的参数,判断是否所有规格的材料数量都够了*/
          s += flag[m];
      if( s == len)/*若所有规格的材料数量都够了,则工作结束,退出循环*/
          Flag=1;   
         if(Flag == 1)
             break;       
   }  
   return i+1;    /*返回原材料的数量*/
}     

阅读(2981) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册