算法:布料切割问题 C语言实现

问题描述:

布料分割问题主要完成根据任意长宽(WH)布料和任意大小模板的布(wihi求解最优利用率以及给出最优分割方案的函数。

其中布料在切割时只能一刀切到底,不能停止。

如图:

算法:布料切割问题 C语言实现

输入样例:5.0 6.0                    2.0 3.0

                  2                            2

                 1.0 4.0                    1.0 3.0

                 2.0 3.0                    2.0 3,0

输出:     0.9333333             1.0

思路:利用分治算法,切一刀后分成两份,再对这两份进行处理。

代码:

#include <stdio.h>
#include <stdlib.h>
float Max(float a,float b)
{
    if(a>b)
        return a;
    else
        return b;
}
float getMax(int n,float *w,float *h,float W,float H)
{
    int i;
    float a[n],k;
    for(i=1;i<=n;i++)
    {
        if(w[i]==W&&h[i]==H)
            a[i]=1.0;
        else if(w[i]>W||h[i]>H)
            a[i]=0.0;
        else if(w[i]==W&&h[i]<H)
        {
            a[i]=(getMax(n,w,h,W,H-h[i])*W*(H-h[i])+getMax(n,w,h,W,h[i])*W*h[i])/(W*H);
        }
        else if(w[i]<W&&h[i]==H)
        {
            a[i]=(getMax(n,w,h,W-w[i],H)*H*(W-w[i])+getMax(n,w,h,w[i],H)*H*w[i])/(W*H);
        }
        else
        {
            a[i]=Max(((getMax(n,w,h,W-w[i],H)*(W-w[i])*H+getMax(n,w,h,w[i],H)*w[i]*H)/(W*H)),((getMax(n,w,h,W,H-h[i])*(H-h[i])*W+getMax(n,w,h,W,h[i])*W*h[i])/(W*H)));
        }
    }
    k=a[1];
    for(i=1;i<=n;i++)
    {
        if(a[i]>k)
        {
            k=a[i];
        }
    }
    return k;
}

int main()
{
    float W,H;
    int i;
    scanf("%f%f",&W,&H);
    int n;
    scanf("%d",&n);
    float w[n],h[n];
    for(i=1;i<=n;i++)
    {
        scanf("%f%f",&w[i],&h[i]);
    }
    printf("%f",getMax(n,w,h,W,H));
    return 0;
}

测试数据:

算法:布料切割问题 C语言实现

算法:布料切割问题 C语言实现