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;
}