hdu 3127 WHUgirls (完全背包)
题意:给定一个矩形,将矩形切成给定任意个数的小矩形,当然每一个小矩形都有对应的权值,求最大权值
分析:其实,就是一个类似完全背包的问题
dp[i][j]表示从(0,0)到(i,j)对应的矩形可以切出小矩形的最大权值和
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<algorithm> #include<string> using namespace std; const int N = 1000+10; struct rec { int x,y; int p; }r[15]; int dp[N][N]; int main() { int T,n,X,Y; scanf("%d",&T); while(T--) { scanf("%d %d %d",&n,&X,&Y); memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++) scanf("%d %d %d",&r[i].x,&r[i].y,&r[i].p); for(int i=1;i<=X;i++) for(int j=1;j<=Y;j++) { for(int k=0;k<n;k++) { for(int t=0;t<2;t++)//枚举俩种矩形,横放,竖放 { if(t&1) swap(r[k].x,r[k].y); if(r[k].x<=i && r[k].y<=j) { //注意有重叠部分,完整的写应该是这样的dp[i][j]=max(dp[i][j],dp[i-r[k].x][j]+dp[i-(i-r[k].x)][j-r[k].y]+r[k].p); dp[i][j]=max(dp[i][j],dp[i-r[k].x][j]+dp[r[k].x][j-r[k].y]+r[k].p);//横切 dp[i][j]=max(dp[i][j],dp[i][j-r[k].y]+dp[i-r[k].x][r[k].y]+r[k].p);//竖切 } } } } printf("%d\n",dp[X][Y]); } return 0; }