hdu 3127 WHUgirls(二维完全背包)

如图4种方式切割

 

#include <stdio.h>
#include <string.h>

 


#define MAXN 1005

int sum1, sum2, weight[MAXN][2], value[MAXN];
int f[MAXN][MAXN];

inline void swap(int &a, int &b)
{
    int t = a;
    a = b;
    b =t;
}

inline int getMax(int a, int b) { return a > b ? a : b; }
void CompletePack(int n)
{
    int i, j, k;
    int x, y, v;
    for(i = 0; i <= sum1; i++)
    {
        for(j = 0; j <= sum2; j++)
        {
            for(k = 1; k <= n; k++)
            {
                x = weight[k][0];
                y = weight[k][1];
                v = value[k];
                if(i >= x && j >= y)
                {
                    f[i][j] = getMax(f[i][j], f[i - x][j] + f[x][j - y] + v);
                    f[i][j] = getMax(f[i][j], f[i][j - y] + f[i - x][y] + v);
                }
                swap(x, y);
                if(i >= x && j >= y)
                {
                    f[i][j] = getMax(f[i][j], f[i - x][j] + f[x][j - y] + v);
                    f[i][j] = getMax(f[i][j], f[i][j - y] + f[i - x][y] + v);
                }
            }
        }
    }
}

int main()
{
    #ifndef ONLINE_JUDGE
    freopen("indata.txt", "r", stdin);
    #endif
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int i, n;
        scanf("%d %d %d", &n, &sum1, &sum2);
        for(i = 1; i <= n; i++)
        {
            scanf("%d %d %d", &weight[i][0], &weight[i][1], &value[i]);
        }
        memset(f, 0, sizeof(f));
        CompletePack(n);
        printf("%d\n", f[sum1][sum2]);
    }
    return 0;
}

posted @ 2010-10-20 13:13  菜到不得鸟  阅读(554)  评论(0编辑  收藏  举报