36. 北理工美女

来源:互联网 发布:临沂大学课程网络平台 编辑:程序博客网 时间:2024/04/28 21:20

众所周知,北理工有很多美女,每个女生都喜欢漂亮的衣服。有一天,她们获得了一个巨大的矩形布料,她们想把这块布料裁剪成一些小的矩形布料,用来制作围巾。但是,不同的人喜欢不同的款式,因此他们开始投票为每一种款式进行定价,并把这些款式和价格记录在本子上。

她们有一个机器可以将一块布料水平或垂直的裁剪成两块更小的矩形布料,且一切到底。现在她们请你帮忙,利用这个机器将原始的那块巨大矩形布料裁剪成本子上记录的款式。美女们想从中获得最大的利润,所以你需要找到一个最佳的裁剪策略。对于同一个款式的围巾,你可以制作任意多个,或者一个都不做。当然,美女们也不强制要求你用完所有的布料。

输入

第一行输入整数 T,表示测试用例的个数

对于每个测试用例,由三个整数组成 N,X,Y。其中,N 表示有 N 种你可以裁剪成的矩形布料,X,Y 表示原始布料的尺寸。

接下来的 N 行,每行由三个整数组成,xi,yi,ci。xi,yi ,ci 分别表示第 i 种可以裁剪成的矩形布料尺寸及价格。

输入数据范围

0 < T <= 20
0 <= N <= 10; 0 < X, Y <= 1000
0 < xi <= X; 0 < yi <= Y; 0 <= ci <= 1000

输出

输出一行结果,表示可获得的最大利润。

测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助测试用例 1以文本方式显示
  1. 1↵
  2. 2 4 4↵
  3. 2 2 2↵
  4. 3 3 9↵
以文本方式显示
  1. 9↵
1秒64M0


//这道题布块的总大小即为容量,而且每种剪法的小布块都有价格,很明显的背包题//而且由于每种减法可以多次使用,这就构成了一个完全背包,由于布条有长宽,所以使用二维数组//小布条的长宽并不是固定的,可以旋转,所以剪法有两种,得出两个状态方程//方程1:dp[i][j] = fMax(dp[i][j], fMax((dp[i - Size[k].i][j] + dp[Size[k].i][j - Size[k].j])//,(dp[i][j - Size[k].j] + dp[i - Size[k].i][Size[k].j])) + Size[k].val)//方程2:dp[i][j] = fMax(dp[i][j], fMax((dp[i - Size[k].j][j] + dp[Size[k].j][j - Size[k].i])//,(dp[i][j - Size[k].i] + dp[i - Size[k].j][Size[k].i])) + Size[k].val)//由于大布块剪去小布块后剩下的布不一定是矩形,这种情况下剩下的布条可以分成两个矩形//所以总价值就是这三个矩形之和,而剩下的矩形又可以看做新的大矩形#include<stdio.h>#include<string.h>int dp[1005][1005] = { 0 };int fMax(int a, int b){return a > b ? a : b;}struct node{int i;int j;int val;}Size[15];int main(){int T_count, Cloth_i, Cloth_j, Cloth_N;scanf("%d", &T_count);while (T_count--){memset(dp, 0, sizeof(dp));memset(Size, 0, sizeof(Size));scanf("%d %d %d", &Cloth_N, &Cloth_i, &Cloth_j);for (int count = 0; count < Cloth_N; count++)scanf("%d %d %d", &Size[count].i, &Size[count].j, &Size[count].val);for (int i = 0; i <= Cloth_i; i++)for (int j = 0; j <= Cloth_j; j++)for (int k = 0; k < Cloth_N; k++){if (i >= Size[k].i && j >= Size[k].j)dp[i][j] = fMax(dp[i][j], fMax((dp[i - Size[k].i][j] + dp[Size[k].i][j - Size[k].j]), (dp[i][j - Size[k].j] + dp[i - Size[k].i][Size[k].j])) + Size[k].val);if (i >= Size[k].j && j >= Size[k].i)dp[i][j] = fMax(dp[i][j], fMax((dp[i - Size[k].j][j] + dp[Size[k].j][j - Size[k].i]), (dp[i][j - Size[k].i] + dp[i - Size[k].j][Size[k].i])) + Size[k].val);}printf("%d\n", dp[Cloth_i][Cloth_j]);}return 0;}






原创粉丝点击