hdu3127(二维完全背包)

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值