有一个长度为L,无限高的长方形,现放入n个长度为l(l为2的n次方且l<=L),高为1的长方形,求放入的长方形最低高度
(长方形只能横着放)
求分析思路
没看懂,啥意思?尽量让L能多装点l呗......n个长方形的长度l都是相等的吗?还是不完全相同?
#include <stdio.h>
int L[10000],s[10000] = {0};//假设最多10000个长方块
int n;
int getFitL(int l,int i)
{
while(i<n)
{
if(s[i] == 0 && L[i] <= l)
return i;
i++;
}
return -1;
}
int main()
{
int i,j,h=0,r=0,t,N,m;
printf("请输入箱子长度:");
scanf("%d",&N);
printf("请输入长方块的数量:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("请输入第%d块长方块的长度:",i);
scanf("%d",&L[i-1]);
}
//排序,简单使用冒泡排序,数量较多时可以选择其它排序法
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
{
if(L[j] < L[j+1])
{
t = L[j];
L[j] = L[j+1];
L[j+1] = t;
}
}
//开始放置长方块
i=0;
while(1)
{
i=0;
r=0;
while(i<n && s[i] != 0) //找下一层的起始块
i++;
if(i==n) //表示所有长方块都已放置完成
{
break;
}
r = L[i];
s[i] = 1;
h++; //高度加1
printf("第%d层:%d ",h,L[i]);
m = i+1;
while(r<N)
{
m = getFitL(N-r,m+1);
if(m==-1) //选不到合适的长方块时,这该层选择结束
{
break;
}
else
{
r += L[m];
s[m] = 1;
printf("%d ",L[m]);
if(r==N)
break;
}
}
printf("\n");
}
printf("高度为:%d\n",h);
return 0;
}
代码如下
#include <stdio.h>
int main()
{
int L, l, n;
int h, t;
scanf("%d %d %d", &L, &n, &l); //输入L n l
t = L / l; //每行能放小箱子的个数
if (n % t == 0)
h = n / t; //小箱子高为1,这里就不再乘以1了
else
h = (n / t) + 1;//小箱子高为1,这里就不再乘以1了
printf("%d", h);
return 0;
}
L和l都确定了,长方形还只能横着放,那就只剩一种放法了,就是往里面按顺序放呗
只要是能放3列别放1列就肯定是最低的呀
记每层放的个数m=L/l
如果n%m==0,那么高度=n/m
否则高度=n/m+1