Codeforces 148E. Porcelain【多重背包】

题目大意:

有一个公主一生气就喜欢摔东西。现在有很多个柜子,每个柜子里面装着很多物品,公主每次摔东西只能随机的选择一个柜子,拿出最左边或者最右边的一个物品摔碎,给出公主最多生气的次数,求生完气之后,公主摔掉物品的价值的最大总和。

做法:

对于每个柜子来说,从左边拿和从右边拿是不一样的,假设最佳方案中,在第i个柜子中需要拿Ki个物品,那么拿着Ki个物品的最大价值我们是可以确定的。一:全从左边拿,二:全从右边拿,三,左边那一部分,右边拿一部分。最后,我们可以算出w[i][k](在第i个柜子中拿k个物品的最大价值),这样的话,问题是不是就抽象为了这样一个问题:

在所有的柜子中,拿出不超过k个物品,求拿出物品最大价值总和。这样的话,该问题就转化为了一个背包,只不过和之前的裸背包有些不一样,多了一维而已。

详见代码

代码:

#include <iostream>
#include <cstdio>
using namespace std;
int v[111][11111],w[111][11111],dp[111][11111];
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        int tt;
        scanf("%d",&tt);
        for(int j=1;j<=tt;j++){
            scanf("%d",&v[i][j]);
            v[i][j]+=v[i][j-1];//前缀和
        }
        w[i][0]=0;
        for(int j=1;j<=tt;j++)
            for(int k=0;k<=j;k++)
                w[i][j]=max(w[i][j],v[i][k]+v[i][tt]-v[i][tt-(j-k)]);//计算在该柜子中取j个物品的最大价值
        v[i][0]=tt;//将该柜子的总物品数存下来
    }
    for(int i=0;i<n;i++)
        for(int j=0;j<=m;j++)
            for(int k=0;k<=v[i][0]&&k<=j;k++)
                dp[i][j]=max(dp[i][j],max(dp[i-1][j],dp[i-1][j-k]+w[i][k]));
    printf("%d\n",dp[n-1][m]);
    return 0;
}
时间: 2024-10-05 12:39:53

Codeforces 148E. Porcelain【多重背包】的相关文章

CodeForces 148E Porcelain dp+背包(水

题目链接:点击打开链接 题意: 给定一个n层书架,一共取m本书. 下面n行给出每层书的价值. 每次可以取任意一层的最左端或最右端的一本书. 问能获得的最大价值. 思路: 1.显然是先求出对于每层任取任意本书能获得的最大价值. 2.然后背包一下. 1: 对于一层书任意j本,那么一定是从左端取k本,右端取 j-k本,求个前缀和然后枚举 j和k即可.每层n^2的dp 2: 分组背包. import java.io.BufferedReader; import java.io.InputStreamRe

Codeforces 148E Porcelain (预处理+多重背包)

E. Porcelain time limit per test:3 seconds memory limit per test:256 megabytes During her tantrums the princess usually smashes some collectable porcelain. Every furious shriek is accompanied with one item smashed. The collection of porcelain is arra

Codeforces 148E Porcelain [预处理+dp背包]

给出n行数,每行的数目不定(不超过100个),只能从行的两端取数m次,求所取数的和最大值 n (1?≤?n?≤?100) andm (1?≤?m?≤?10000). 看似很难上手 我甚至想每次取一个,然后搜索,,,搜索分支有200个 如果我们知道每行取k个最多能取多少的话 那么 这个问题就变成了 如果我在前i-1行取了j次得到x的破坏值 那么我要再第i行取k次得到get[k]的破坏值 也就是前i行共取了k+j次得到了x+get[k]的破坏值 背包问题 暴力求解出每行取k个最大的破坏值即可(一个滑

codeforces 148E Porcelain

E. Porcelain During her tantrums the princess usually smashes some collectable porcelain. Every furious shriek is accompanied with one item smashed. The collection of porcelain is arranged neatly on n shelves. Within each shelf the items are placed i

codeforces 148E Aragorn&#39;s Story 背包DP

Aragorn's Story Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/problem/148/E Description Our protagonist is the handsome human prince Aragorn comes from The Lord of the Rings. One day Aragorn finds a lot of enemies who

Codeforces 106 C Buns【多重背包】

今天拉了一场CF,做了一下,略坑啊...首先105A题,竟然卡精度,小数点两位卡精度,需要给他加一个1e-6,算是见识了 题目:Codeforces 106 C Buns 题意:给出一些n克面,以及m种馅儿,每种馅儿做面包需要的面的克数和馅儿的克数以及馅儿的总克数,面也可以单独做面包,然后每一种面包都有价格,求做的面包的总价格最高? 分析:很贱的题目啊,读了之后就开始贪心,贪心竟然过了10组数据,然后我以为有漏洞,后来发现是个多重背包.dp的题目最怕用贪心做了,幸亏发现了. 标准的多种背包,转化

[hdu5445 Food Problem]多重背包

题意:一堆食物,有价值.空间.数量三种属性,一些卡车,有空间,价格,数量三种属性.求最少的钱(不超过50000)买卡车装下价值大于等于给定价值的食物,食物可以拆开来放. 思路:这题的关键是给定的条件:食物可以拆开来放.这个条件使得卡车和食物可以分开考虑,然后通过空间这个属性联系在一起.做两遍多重背包即可. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

hdu 2079 选课时间(题目已修改,注意读题) 多重背包

选课时间(题目已修改,注意读题) Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3162    Accepted Submission(s): 2472 Problem Description 又到了选课的时间了,xhd看着选课表发呆,为了想让下一学期好过点,他想知道学n个学分共有多少组合.你来帮帮他吧.(xhd认为一样学分的课没区别

HDU-1171 Big Event in HDU (多重背包)

Problem Description Nowadays, we all know that Computer College is the biggest department in HDU. But, maybe you don't know that Computer College had ever been split into Computer College and Software College in 2002.The splitting is absolutely a big