正文

木料问题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;    /*返回原材料的数量*/ }     

阅读(5215) | 评论(0)


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

评论

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