HDU3127 WHUgirls

想到了用背包 一开始没想到怎么做,后来又因为细节出错了。。

应该用在每个状态将每种布快形状都先考虑放入,这样可以保证之后的状态可以是从之前最优的推出。。如果换个写法就不行了

#include <algorithm>
#include <iostream>
#include <string>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
using namespace std;
int dp[1105][1105];
struct TH
{
    int x, y, c;
} th[25];
int main()
{
    int i, j, k, T, n, x, y, a, b, c;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&n,&x,&y);
        for(i=0; i<=x; i++)
            for(j=0; j<=y; j++)
                dp[i][j]=0;
        for(k=0; k<n; k++)
        {
            scanf("%d%d%d",&th[k].x,&th[k].y,&th[k].c);
        }
        for(i=1; i<=x; i++)
            for(j=1; j<=y; j++)
            {
                for(k=0; k<n; k++)
                {
                    a=th[k].x, b=th[k].y, c=th[k].c;
                    if(i>=a&&j>=b)
                    {
                        dp[i][j]=max(dp[i][j],max(dp[i-a][j]+dp[a][j-b],dp[i][j-b]+dp[i-a][b])+c);
                    }
                    swap(a,b);
                    if(i>=a&&j>=b)
                    {
                        dp[i][j]=max(dp[i][j],max(dp[i-a][j]+dp[a][j-b],dp[i][j-b]+dp[i-a][b])+c);
                    }
                }
            }
        printf("%d\n",dp[x][y]);
    }
    return 0;
}

 

posted @ 2013-10-30 10:42  Ink_syk  阅读(177)  评论(0编辑  收藏  举报