题目链接: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. MySQL具体解释(14)----------事务处理

    前言:前一篇文章关于事务处理的博文没有写清楚,读起来非常晦涩.非常难理解,所以有整理了一些资料,帮助理解.见谅! 关于MySQL事务处理学习记 START TRANSACTION COMMIT ROL ...

  2. Backup and Recovery Basics2

    1.6.Automatic Disk-Based Backup and Recovery: The Flash Recovery Area 创建不同备份和恢复文件的组件对每一个文件系统的大小没有不论什 ...

  3. 【Python】分析文本split()

    分析单个文本 split()方法,是以空格为分隔符将字符串拆分成多个部分,并将这些部分存储到一个列表中 title = 'My name is oliver!' list = title.split( ...

  4. 应用程序之TableView简单总结1

    UITableView的代理方法 修改Cell的状态 UITableView常见方法 一.UITableView的代理方法 #pragma mark 每一行的高度 - (CGFloat)tableVi ...

  5. git stash 保存当前工作状态

    1. git stash   暂存当前工作状态 2. git stash list 查看暂存列表 3. git stash save 'title' 暂存工作状态并添加说明 4. git stash ...

  6. POJ 2985 Treap平衡树(求第k大的元素)

    这题也能够用树状数组做,并且树状数组姿势更加优美.代码更加少,只是这个Treap树就是求第K大元素的专家--所以速度比較快. 这个也是从那本红书上拿的模板--自己找了资料百度了好久,才理解这个Trea ...

  7. KEIL下分散加载文件的使用(zt)

    KEIL下分散加载文件的使用   对于分散加载的概念,在<ARM体系结构与编程>书中第11章有明确介绍. 分散加载文件(即scatter file 后缀为.scf)是一个文本文件,通过编写 ...

  8. 基于zookeeper或redis实现分布式锁

    前言 在分布式系统中,分布式锁是为了解决多实例之间的同步问题.例如master选举,能够获取分布式锁的就是master,获取失败的就是slave.又或者能够获取锁的实例能够完成特定的操作. 目前比较常 ...

  9. 【BZOJ4453】cys就是要拿英魂! 后缀数组+单调栈+set

    [BZOJ4453]cys就是要拿英魂! Description pps又开始dota视频直播了!一群每天被pps虐的蒟蒻决定学习pps的操作技术,他们把pps在这局放的技能记录了下来,每个技能用一个 ...

  10. 在做RTSP摄像机H5无插件直播中遇到的对接海康摄像机发送OPTIONS心跳时遇到的坑

    我们在实现一套EasyNVR无插件直播方案时,选择了采用厂家无关化的通用协议RTSP/Onvif接入摄像机IPC/NVR设备,总所周知,Onvif是摄像机的发现与控制管理协议,Onvif用到的流媒体协 ...