题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2021

题意:

  John要建一个奶酪塔,高度最大为m。

  他有n种奶酪。第i种高度为h[i](一定是5的倍数),价值为w[i]。

  一块高度>=t的奶酪被称为大奶酪,一个奶酪如果在它上方有大奶酪(多块只算一次),它的高度就会变成原来的4/5。

  John想让他的奶酪他价值和最大,求这个最大值。

题解:

  方法一:

    dp + 贪心。

    贪心:如果奶酪塔中有大奶酪,则大奶酪一定放在最上面。

    (1)有大奶酪时:

      枚举放在最上面的大奶酪k。

      然后将所有奶酪的高度看作h[i]*4/5,塔的最大高度为m-h[k],跑一遍完全背包。

      每一次的答案 = 完全背包的答案 + w[k],取最大。

    (2)没大奶酪时:

      最后再跑一遍没有大奶酪的完全背包,取最大。

  方法二:

    分成两种情况分别处理:

      (1)塔中有大奶酪:

        dp[i]表示高度为i,有大奶酪时的最大价值。

        初始值:

          先将dp设为-INF。

          然后对于所有的大奶酪i,dp[h[i]] = max w[i]。

        然后将所有高度看作原来的4/5,跑一遍完全背包。

      (2)没有大奶酪:

        高度为原先的高度,直接跑完全背包。

    对于两种情况取最大就好。

AC Code(1):

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAX_N 105
#define MAX_M 1005 using namespace std; int n,m,t;
int ans=;
int w[MAX_N];
int h[MAX_N];
int dp[MAX_M]; void read()
{
cin>>n>>m>>t;
for(int i=;i<n;i++)
{
cin>>w[i]>>h[i];
}
} int cal_dp(int m,int u,int d)
{
int best=;
memset(dp,,sizeof(dp));
for(int i=;i<n;i++)
{
for(int j=h[i]*u/d;j<=m;j++)
{
dp[j]=max(dp[j],dp[j-h[i]*u/d]+w[i]);
best=max(best,dp[j]);
}
}
return best;
} void solve()
{
for(int i=;i<n;i++)
{
if(h[i]>=t) ans=max(ans,cal_dp(m-h[i],,)+w[i]);
}
ans=max(ans,cal_dp(m,,));
} void print()
{
cout<<ans<<endl;
} int main()
{
read();
solve();
print();
}

AC Code(2):

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 105
#define MAX_M 1005 using namespace std; int n,m,t;
int ans=;
int w[MAX_N];
int h[MAX_N];
int dp[MAX_M]; void read()
{
cin>>n>>m>>t;
for(int i=;i<n;i++)
{
cin>>w[i]>>h[i];
}
} int cal_dp(int u,int d)
{
int best=;
for(int i=;i<n;i++)
{
for(int j=h[i]*u/d;j<=m;j++)
{
dp[j]=max(dp[j],dp[j-h[i]*u/d]+w[i]);
best=max(best,dp[j]);
}
}
return best;
} void solve()
{
memset(dp,0x80,sizeof(dp));
for(int i=;i<n;i++)
{
if(h[i]>=t) dp[h[i]]=max(dp[h[i]],w[i]);
}
ans=max(ans,cal_dp(,));
memset(dp,,sizeof(dp));
ans=max(ans,cal_dp(,));
} void print()
{
cout<<ans<<endl;
} int main()
{
read();
solve();
print();
}

BZOJ 2021 [Usaco2010 Jan]Cheese Towers:dp + 贪心的更多相关文章

  1. BZOJ 2021 Usaco2010 Jan Cheese Towers 动态规划

    题目大意:全然背包.假设最顶端的物品重量≥k,那么以下的全部物品的重量变为原来的45 考虑一些物品装进背包,显然我要把全部重量大于≥k的物品中重量最小的那个放在最顶端.才干保证总重量最小 那么我们给物 ...

  2. 【BZOJ】2021: [Usaco2010 Jan]Cheese Towers(dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2021 噗,自己太弱想不到. 原来是2次背包. 由于只要有一个大于k的高度的,而且这个必须放在最顶,那 ...

  3. BZOJ2021: [Usaco2010 Jan]Cheese Towers

    2021: [Usaco2010 Jan]Cheese Towers Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 184  Solved: 107[Su ...

  4. bzoj 1783: [Usaco2010 Jan]Taking Turns【贪心+dp】

    不知道该叫贪心还是dp 倒着来,记f[0][i],f[1][i]分别为先手和后手从n走到i的最大值.先手显然是取最大的,当后手取到比先手大的时候就交换 #include<iostream> ...

  5. bzoj 1783: [Usaco2010 Jan]Taking Turns

    1783: [Usaco2010 Jan]Taking Turns Description Farmer John has invented a new way of feeding his cows ...

  6. BZOJ 2020 [Usaco2010 Jan]Buying Feed,II:贪心【定义价值】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2020 题意: FJ开车去买K份食物. 如果他的车上有X份食物,每走一里就花费X元. FJ的 ...

  7. BZOJ 1677: [Usaco2005 Jan]Sumsets 求和( dp )

    完全背包.. --------------------------------------------------------------------------------------- #incl ...

  8. bzoj 4472: [Jsoi2015]salesman【树形dp+贪心】

    一个点,设f[u]为要取最大值显然是前最大停留次数-1个儿子的正数f和,排个序贪心即可 判重的话就是看没选的里面是否有和选了的里面f值相同的,有的话就是一.注意在选的时候要把加进f的儿子的g合并上去 ...

  9. bzoj 2016: [Usaco2010]Chocolate Eating【二分+贪心】

    二分答案,贪心判断,洛谷上要开long long #include<iostream> #include<cstdio> using namespace std; const ...

随机推荐

  1. koajs 项目实战(二)

    此篇文章,接 koajs 项目实战(一)后写 (六)表单提交和参数接收 表单: <form method="post" action="./users/zhuce& ...

  2. Linux装mysqli.so

    php 5.2.3+mysqli 安装与常见错误 总结 php 5.2.3+mysqli 安装与常见错误 总结   记得原来在编译php的已经已经加上参数--with-mysql=/usr/local ...

  3. hive分区(partition)简介

    一.背景 1.在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念. 2.分区表指的是在创建表 ...

  4. 六种基本DCDC变换器拓扑结构

    1.SEPIC电路 2.

  5. spring中的异步事件

    这里讲解一下Spring对异步事件机制的支持,实现方式有两种: 1.全局异步 即只要是触发事件都是以异步执行,具体配置(spring-config-register.xml)如下: Java代码   ...

  6. hashCode与equals的作用与区别及应当注意的细节

    最近去面试了几家公司,被问到hashCode的作用,虽然回答出来了,但是自己还是对hashCode和equals的作用一知半解的,所以决定把它们研究一下. 以前写程序一直没有注意hashCode的作用 ...

  7. 深入浅出Attribute(二)

    上篇里,我们把Attribute“粘”在类的成员方法上show了一把,让Attribute跟大家混了个脸儿熟.中篇里,我们将探讨“究竟什么是Attribute”和“如何创建及使用Attribute”这 ...

  8. python学习(一)运行第一个python脚本

    当然这里指的是在linux或者unix下,像写bash脚本那样 #!/usr/bin/python print('The Bright Side ' + 'of Life...') 反正我建议就算一开 ...

  9. AI生万物,新世界的大门已敞开

    四月是万物复苏的时节,一年一度的GMIC全球移动互联网大会也在这个时间如期而至,在4月26日-28日的会议期间,有超过三百位行业专家进行了精彩的演讲,更有数万名现场观众感受到思维碰撞迸发出的火花. 作 ...

  10. 流式 storm介绍

    Storm是什么 如果只用一句话来描述storm的话,可能会是这样:分布式实时计算系统.按照storm作者的说法,storm对于实时计算的意义类似于hadoop对于批处理的意义.我们都知道,根据goo ...