想到了用背包 一开始没想到怎么做,后来又因为细节出错了。。
应该用在每个状态将每种布快形状都先考虑放入,这样可以保证之后的状态可以是从之前最优的推出。。如果换个写法就不行了
#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; }