#include<stdio.h>
#define N 2
int total,n,orderlen[10];
int sele[10],bestsele[10],bestlen;
/*sele[10]中的元素为1,则加上相应编号的订单长度。如果加起来的和符合条件,则把方案存在bestsele[]中。
bestlen中存放满足条件的最大长度值*/
void test()
{
int i,len;
for(len=i=0;i<n;i++)
if(sele[i])
len+=orderlen[i]+N;//如果sele[i]=1,那么就加上相应编号的订单长度
if(len-2<=total)/* 注意最后一段可能不需要切割 */
{
if(bestlen<len)
{
bestlen=len;
for(i=0;i<n;i++)
bestsele[i]=sele[i];
}
for(i=0;i<n;i++)
{
if(!sele[i])
{
sele[i]=1;
test();//递归的方法来测试每一种可能
sele[i]=0;
}
}
}
}
void main()
{
int i;
printf("input the length of the steel\n");
scanf("%d",&total);
printf("input number of order\n");
scanf("%d",&n);
printf("input the length of every order\n");
for(i=0;i<n;i++)
scanf("%d",&orderlen[i]);
for(i=0;i<n;i++)
sele[i]=bestsele[i]=0;
bestlen=0;
test();
for(i=0;i<n;i++)
if(bestsele[i])
printf("%d->%d\n",i,orderlen[i]);
}
求解钢材切割的最佳订单
最新推荐文章于 2022-05-09 14:37:23 发布