hdu 3127 WHUgirls (完全背包)

题意:给定一个矩形,将矩形切成给定任意个数的小矩形,当然每一个小矩形都有对应的权值,求最大权值

分析:其实,就是一个类似完全背包的问题

dp[i][j]表示从(0,0)到(i,j)对应的矩形可以切出小矩形的最大权值和

View Code
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int N = 1000+10;
struct rec
{
    int x,y;
    int p;
}r[15];
int dp[N][N];
int main()
{
    int T,n,X,Y;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d %d %d",&n,&X,&Y);
        memset(dp,0,sizeof(dp));
        for(int i=0;i<n;i++)
            scanf("%d %d %d",&r[i].x,&r[i].y,&r[i].p);
        for(int i=1;i<=X;i++)
            for(int j=1;j<=Y;j++)
            {
                for(int k=0;k<n;k++)
                {
                    for(int t=0;t<2;t++)//枚举俩种矩形,横放,竖放
                    {
                        if(t&1)
                            swap(r[k].x,r[k].y);
                        if(r[k].x<=i && r[k].y<=j)
                        {
                            //注意有重叠部分,完整的写应该是这样的dp[i][j]=max(dp[i][j],dp[i-r[k].x][j]+dp[i-(i-r[k].x)][j-r[k].y]+r[k].p);
                            dp[i][j]=max(dp[i][j],dp[i-r[k].x][j]+dp[r[k].x][j-r[k].y]+r[k].p);//横切
                            dp[i][j]=max(dp[i][j],dp[i][j-r[k].y]+dp[i-r[k].x][r[k].y]+r[k].p);//竖切
                        }
                    }
                }
            }
        printf("%d\n",dp[X][Y]);
    }
    return 0;
}

 

posted @ 2012-04-14 20:49  枕边梦  阅读(334)  评论(0编辑  收藏  举报