/*算法高手请进。有一个难题求解?
标准原材料长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; /*返回原材料的数量*/
}
正文
木料问题2005-04-23 07:02:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/goal00001111/691.html
阅读(2981) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论