zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    spring-ioc
    Hibernate之二级缓存
    hibernate之HQL语句
    hibernate 多对多关联关系
    hibernate关联关系(一对多)
    Hibernate之主键生成策略
    struts2的CRUD
    struts2的OGNL
    struts2的初步认识
    Maven介绍
  • 原文地址:https://www.cnblogs.com/nanke/p/2447557.html
Copyright © 2011-2022 走看看