有一堆长度为90的木材A,而需要一批长度分别
40 ,25,30,20(这一组数据可增,可减,变化的)的木材。
请问A类木材有几种分割法呢?
所以的分割方法列表如下:如何用递归法求出?
90
40 25 30 20
1 2 0 0 0 一根a只能分二根40
2 1 2 0 0 一根a可分一根40,二根25
3 1 1 0 1 a 可分一根40 一根25 一根20的
4 0 3 0 0 ...
5 0 2 1 0 ...
6 0 2 0 2 ...
7 0 1 2 0 ...
8 0 1 1 1 ...
9 0 0 3 0 ...
10 0 0 2 1 ...
11 0 0 1 3 ...
12 0 0 0 4 ...
1根好求,N根的话还是装箱问题,无有效算法。
既然楼主说递归就递归吧,废话就不多说啦,看代码:
#include <stdio.h>
#define A 90
#define S 4
int wood[S]={40,25,30,20};
int out[S];
int count=0;
void Divide(int len,int style)
{
int i;
if (style==S-1)
{
count++;
out[style]=len/wood[style];
printf("%3d",count);
for (i=0;i<S;i++)
printf("%5d",out[i]);
printf("\n");
}
else
{
for (i=len/wood[style];i>=0;i--)
{
out[style]=i;
Divide(len-i*wood[style],style+1);
}
}
}
int main()
{
int i;
printf("NO.");
for (i=0;i<S;i++)
printf("%5d",wood[i]);
printf("\n");
Divide(A,0);
}