http://acm.hdu.edu.cn/showproblem.php?pid=3127
题意:给你一块X*Y的布,然后选做n个围巾,给出n个围巾的长和宽,做出每个围巾会获得相应的利润。
题意:问该怎样分配这块布,才能获得最大的利润
分析:切割方式就是当前选择的物品作为第一个矩形,在大矩形的右下角切,有两种切割方式。
分析:每种方式有2种情况,如下:
方式一:
方式二:
其次:一般的完全背包问题,对于物品的选择顺序是没有要求的,所以限制条件的循环和物品选择的循环是可以互换的,
但是这个题,对每一个大矩形,在右下角首先选择哪一个物品作为第一个物品是有影响的,所以把物品选择循环设
为内循环,没有次都对n个物品做第一个物品做判断。
dp[i][j]表示从(0,0)到(i,j)对应的矩形可以切出小矩形的最大权值和。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
int dp[1002][1002];
int x[11],y[11],c[11];
int main(){
int T;scanf("%d",&T);
while(T--){
int N,X,Y;scanf("%d%d%d",&N,&X,&Y);
memset(dp,0,sizeof(dp));
for(int i=0;i<N;i++) scanf("%d%d%d",&x[i],&y[i],&c[i]);
for(int j=0;j<=X;j++)
for(int k=0;k<=Y;k++)
for(int i=0;i<N;i++){
if(j>=x[i]&&k>=y[i]){//方式一
dp[j][k]=max(dp[j][k],dp[j-x[i]][k]+dp[x[i]][k-y[i]]+c[i]);
dp[j][k]=max(dp[j][k],dp[j][k-y[i]]+dp[j-x[i]][y[i]]+c[i]);
}if(j>=y[i]&&k>=x[i]){//方式二
dp[j][k]=max(dp[j][k],dp[j-y[i]][k]+dp[y[i]][k-x[i]]+c[i]);
dp[j][k]=max(dp[j][k],dp[j][k-x[i]]+dp[j-y[i]][x[i]]+c[i]);
}
}
printf("%d\n",dp[X][Y]);
}
return 0;
}