HLG 1240 WHUgirls

 

题意:  给一个固定大小的布料,给出n 个固定的尺寸,每个尺寸的布料对应一定的价值,问如何裁剪原来的布料能可以获得最大的价值。

分析: 应为每个尺寸的布料都对应四种切法,(蓝色部分)

           

           

 

 所以状态转移方程为:

        dp[i][j]=max(dp[i][j],max(d[i-ll][j]+d[ll][j-ww],d[i][j-ww]+d[i-ll][ww])+p);
        dp[i][j]=max(dp[i][j],max(d[i-ww][j]+d[ww][j-ll],d[i][j-ll]+d[i-ww][ll])+p);

View Code
#include<stdio.h>
#include<string.h>
#define clr(x)memset(x,0,sizeof(x))
int d[1002][1002];
int max(int a,int b)
{
    return a>b?a:b;
}
struct node
{
    int l,w,p;
}q[12];
int main()
{
    int t,ll,wi,n;
    int i,j,k;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&ll,&wi);
        clr(d);
        for(i=0;i<n;i++)
            scanf("%d%d%d",&q[i].l,&q[i].w,&q[i].p);
        for(i=1;i<=ll;i++)
            for(j=1;j<=wi;j++)
            {
                for(k=0;k<n;k++)
                {
                    if(i>=q[k].l&&j>=q[k].w)
                        d[i][j]=max(d[i][j],max(d[i-q[k].l][j]+d[q[k].l][j-q[k].w],d[i][j-q[k].w]+d[i-q[k].l][q[k].w])+q[k].p);
                    if(i>=q[k].w&&j>=q[k].l)
                        d[i][j]=max(d[i][j],max(d[i-q[k].w][j]+d[q[k].w][j-q[k].l],d[i][j-q[k].l]+d[i-q[k].w][q[k].l])+q[k].p);
                }
            }
        printf("%d\n",d[ll][wi]);
    }
    return 0;
}

 

posted @ 2012-06-16 16:37  'wind  阅读(216)  评论(0编辑  收藏  举报