写过的最坑的题目。
题意很不清楚,意思是把一块布横向或者纵向切割,如果得到一块长xi,宽yi的布就可以得到vi的价值。
首先每两次切割都必须得到一块有价值的布(题目哪里有说啊)。
然后就很简单了暴力枚举。
坑爹的是long long 死活wa 改成int居然就好了也是瞎了狗眼。
#include <bits/stdc++.h>
using namespace std;
#define maxn 33
struct node {
int x, y, val;
node (int _x = 0, int _y = 0, int _val = 0) : x(_x), y(_y), val(_val) {}
}p[maxn];
int t, n, tot;
int dp[1111][1111];
int solve (int x, int y) { //长x 宽y
memset (dp, 0, sizeof dp);
for (int i = 0; i <= x; i++) {
for (int j = 0; j <= y; j++) {
for (int k = 0; k < tot; k++) {
if (i >= p[k].x && j >= p[k].y) {
dp[i][j] = max (dp[i][j], dp[i-p[k].x][j]+dp[p[k].x][j-p[k].y]+p[k].val);
dp[i][j] = max (dp[i][j], dp[i][j-p[k].y]+dp[i-p[k].x][p[k].y]+p[k].val);
}
}
}
}
return dp[x][y];
}
int main () {
//freopen ("in", "r", stdin);
scanf ("%d", &t);
while (t--) {
tot = 0;
int x, y;
scanf ("%d%d%d", &n, &x, &y);
if (n == 0) {
printf ("0\n");
continue;
}
for (int i = 1; i <= n; i++) {
int xx, yy, vv;
scanf ("%d%d%d", &xx, &yy, &vv);
p[tot++] = node (xx, yy, vv);
p[tot++] = node (yy, xx, vv);
}
printf ("%d\n", solve (x, y));
}
return 0;
}