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
输出
输出一行结果,表示可获得的最大利润。
- 1↵
- 2 4 4↵
- 2 2 2↵
- 3 3 9↵
- 9↵
//这道题布块的总大小即为容量,而且每种剪法的小布块都有价格,很明显的背包题//而且由于每种减法可以多次使用,这就构成了一个完全背包,由于布条有长宽,所以使用二维数组//小布条的长宽并不是固定的,可以旋转,所以剪法有两种,得出两个状态方程//方程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;}
阅读全文
0 0
- 36. 北理工美女
- 北理工2012
- 北理工2010
- 美女
- 美女
- 美女
- 美女
- 美女
- 美女
- 美女
- 美女
- 美女
- 北理工的葬礼
- 北理工信息安全对抗
- 北理工虚拟现实作业
- 北理工的恶龙
- 北理工FTP地址
- 北理工考研总结
- 关于点击微信图文信息直接跳转至外部链接
- 34. Little Bishops
- CRC校验
- 35. 双塔问题
- 第一章 Java程序设计概述
- 36. 北理工美女
- Java实现-最小差
- VS2013 编译Microsoft Detours库
- 搞清楚 Python traceback
- 用sysdba用户 解锁 scott用户 并用 修改用户密码
- 开发者自述:我是如何从 0 到 1 走进 Kaggle 的
- 51nod1245 Binomial Coefficients Revenge
- 机房重构--三层登录
- [Python模块学习]使用标准库fractions模块使Python支持分数类型