hdu 3127 WHUgirls

题目:

链接:点击打开链接

题意:

武汉大学有很多漂亮的妹纸,,,,,,,他们有一块待剪的布,他们想把它剪成很多小块做围巾,每个人喜欢不同的风格,他们把每一块的价值写在了纸上,现在有一个机器,可以把一块布剪成两块矩形的布,要求你用这台机器把原始的大布剪成纸上出现的小布,他们希望的到小块布的价值最大,当然不要求用完所有的布。。

思路:

首先它是一个背包问题:1>大布尺寸是总容量,每个小布都有相应的费用,2>要求剪的小布的个数是不限的,3>每块小布都有价值,要求大布被裁剪后的最大价值,(完全背包中的背包的最大价值)。

max((dp[i-a[k].x][j]+dp[a[k].x][j-a[k].y]),(dp[i][j-a[k].y]+dp[i-a[k].x][a[k].y]))+a[k].c//a[k].c是当前块的价值,
max((dp[i-a[k].x][j]+dp[a[k].x][j-a[k].y]),(dp[i][j-a[k].y]+dp[i-a[k].x][a[k].y]))//剩余块的的最大价值

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

struct node
{
    int x;
    int y;
    int c;
}a[11];

int dp[1005][1005];

int main()
{
    int N,X,Y,t;
    scanf("%d",&t);
    while(t--)
    {
        memset(dp,0,sizeof(dp));
        scanf("%d%d%d",&N,&X,&Y);
        for(int i=0; i<N; i++)
            scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].c);
        for(int i=1; i<=X; i++)
        {
            for(int j=1; j<=Y; j++)
            {
                for(int k=0; k<N; k++)
                {
                    if(i>=a[k].x && j>=a[k].y)//分两种情况,
                        dp[i][j] = max(dp[i][j],max((dp[i-a[k].x][j]+dp[a[k].x][j-a[k].y]),(dp[i][j-a[k].y]+dp[i-a[k].x][a[k].y]))+a[k].c);
                    if(i>=a[k].y && j>=a[k].x)
                        dp[i][j] = max(dp[i][j],max((dp[i-a[k].y][j]+dp[a[k].y][j-a[k].x]),(dp[i][j-a[k].x]+dp[i-a[k].y][a[k].x]))+a[k].c);
                }
            }
        }
        printf("%d\n",dp[X][Y]);
    }
    return 0;
}

------------------------------------------------------------------------------------

看了大牛的代码和讲解点击打开链接

------------------------------------------------------------------------------------

hdu 3127 WHUgirls

时间: 2024-11-03 22:04:41

hdu 3127 WHUgirls的相关文章

hdu 3127 WHUgirls(完全背包)

WHUgirls Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 2251    Accepted Submission(s): 852 Problem Description There are many pretty girls in Wuhan University, and as we know, every girl lo

HDU 3127 WHUgirls(完全背包)

http://acm.hdu.edu.cn/showproblem.php?pid=3127 题意: 现在有一块X*Y的矩形布条, 然后有n种规格的x[i]*y[i]的小布条, 每种布条可以卖出val[i]的价值. 问你原始的X*Y布条最多能卖多少价值?   其中每次切割布条只能水平或垂直的切, 且一刀到底. 分析: 本题看起来比较麻烦, 但是搞懂原理后还是很简单的. 把当前还剩余的矩形布条看成容量, 那么我们就是再这有限的容量里面要找出最大价值的布条总和来. 令dp[i][j]==x 表示当前

HDU 3127 WHUgirls【二维完全背包】

题意:给出一个长为a,宽为b的布,再给出n个围巾的规格(长x,宽y,价值c),问怎样裁剪能够得到最大的价值. ----第一次做的时候不会---然后放到今天做--发现还是不会---于是又--看题解了[email protected][email protected]=== 因为相同规格的围巾可以重复剪多次,且围巾的长和宽相当于两个约束,所以可以转换为二维费用的完全背包问题. 然后就是围巾的裁剪 第一种 横着减 裁切线分为两种对于左上的第一个图,当减去长为x,宽有长为y的一个矩形之后,剩余的面积之和

hdu 3127 完全背包变形

背景:这个题实在没法,看的题解的思路,确实很难想到.也算明白了背包问题只是母题,其生的儿子,往往找不出来原来的母亲了. 思路: 我的代码: #include<cstdio> #include<iostream> #include<cstring> using namespace std; int F[1009][1009],w[10][3]; int main(void){ int t,n,x,y; scanf("%d",&t); while

【HDOJ】3127 WHUgirls

1 #include <stdio.h> 2 #include <string.h> 3 4 #define mymax(a, b) (a>b) ? a:b 5 6 typedef struct { 7 int x, y, c; 8 } rect_st; 9 10 rect_st rects[15]; 11 12 int dp[1005][1005]; 13 14 int main() { 15 int case_n; 16 int x, y, n; 17 int i, j,

二维dp

原题http://acm.hdu.edu.cn/showproblem.php?pid=3127 WHUgirls Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 2050    Accepted Submission(s): 780 Problem Description There are many pretty girls i

hdu 1284 钱币兑换问题 (递推 || DP || 母函数)

钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5069    Accepted Submission(s): 2868 Problem Description 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法. Input 每行只有一个正整数N,N小于32768. Outpu

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include