BZOJ 2021 [Usaco2010 Jan]Cheese Towers:dp + 贪心
题目链接: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 + 贪心的更多相关文章
- BZOJ 2021 Usaco2010 Jan Cheese Towers 动态规划
题目大意:全然背包.假设最顶端的物品重量≥k,那么以下的全部物品的重量变为原来的45 考虑一些物品装进背包,显然我要把全部重量大于≥k的物品中重量最小的那个放在最顶端.才干保证总重量最小 那么我们给物 ...
- 【BZOJ】2021: [Usaco2010 Jan]Cheese Towers(dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=2021 噗,自己太弱想不到. 原来是2次背包. 由于只要有一个大于k的高度的,而且这个必须放在最顶,那 ...
- BZOJ2021: [Usaco2010 Jan]Cheese Towers
2021: [Usaco2010 Jan]Cheese Towers Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 184 Solved: 107[Su ...
- bzoj 1783: [Usaco2010 Jan]Taking Turns【贪心+dp】
不知道该叫贪心还是dp 倒着来,记f[0][i],f[1][i]分别为先手和后手从n走到i的最大值.先手显然是取最大的,当后手取到比先手大的时候就交换 #include<iostream> ...
- bzoj 1783: [Usaco2010 Jan]Taking Turns
1783: [Usaco2010 Jan]Taking Turns Description Farmer John has invented a new way of feeding his cows ...
- BZOJ 2020 [Usaco2010 Jan]Buying Feed,II:贪心【定义价值】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2020 题意: FJ开车去买K份食物. 如果他的车上有X份食物,每走一里就花费X元. FJ的 ...
- BZOJ 1677: [Usaco2005 Jan]Sumsets 求和( dp )
完全背包.. --------------------------------------------------------------------------------------- #incl ...
- bzoj 4472: [Jsoi2015]salesman【树形dp+贪心】
一个点,设f[u]为要取最大值显然是前最大停留次数-1个儿子的正数f和,排个序贪心即可 判重的话就是看没选的里面是否有和选了的里面f值相同的,有的话就是一.注意在选的时候要把加进f的儿子的g合并上去 ...
- bzoj 2016: [Usaco2010]Chocolate Eating【二分+贪心】
二分答案,贪心判断,洛谷上要开long long #include<iostream> #include<cstdio> using namespace std; const ...
随机推荐
- POJ 1785 Binary Search Heap Construction (线段树)
题目大意: 给出的东西要求建立一个堆,使得后面的数字满足堆的性质.并且字符串满足搜索序 思路分析: 用线段树的最大询问建树.在建树之前先排序,然后用中序遍历递归输出. 注意输入的时候的技巧. .. # ...
- kill -signal
1. SIGHUP 启动被终止的进程,可让该PID重新读取配置文件,类似于重启服务 对应的数字为1 9.SIGTERM 以正常的结束进程来终止进程 15.SIGSTOP 暂停一个进程相当于crtl+z
- win下配置java环境变量
系统变量→新建 JAVA_HOME 变量 . 变量值填写jdk的安装目录(本人是 E:\Java\jdk1.7.0) 系统变量→寻找 Path 变量→编辑 在变量值最后输入 %JAVA_HOME%\ ...
- google PLDA + 实现原理及源代码分析
LDA背景 LDA(隐含狄利克雷分布)是一个主题聚类模型,是当前主题聚类领域最火.最有力的模型之中的一个,它能通过多轮迭代把特征向量集合按主题分类. 眼下,广泛运用在文本主题聚类中. LDA的开源实现 ...
- 如何删除mysql 主键索引
如果一个主键是自增长的,不能直接删除该列的主键索引, 应当先取消自增长,再删除主键特性 alter table 表名 drop primary key; [如果这个主键是自增的,先取消自增长.] ...
- Cardboard虚拟现实开发初步(一)
Google Cardboard 虚拟现实眼镜开发初步(一) 虚拟现实技术简单介绍 不得不说这几年虚拟现实技术逐渐火热,伴随着虚拟现实设备的价格迅速平民化,越来越多的虚拟现实设备来到了我们眼前,也因此 ...
- 在 Linux 多节点安装配置 Apache Zookeeper 分布式集群
规划: 三台物理服务器就形成了(法定人数).对于高可用性集群,您可以使用高于3的任何奇数.例如,如果设置5台服务器,则集群可以处理两个故障节点等. 物理服务器需要开启的端口 2888 , 3888 和 ...
- VueJS组件之间通过props交互及验证
props 是父组件用来传递数据的一个自定义属性.父组件的数据需要通过 props 把数据传给子组件,子组件需要显式地用 props 选项声明 "prop". 父组件通过props ...
- jquery判断复选框是否被选中
$("#isUse").click(function(){ if($(this).is(':checked')){ $(this).attr('checked','checked' ...
- 卸载gnu gcj
麻辣个鸡的,我在Linux上安装的jkd版本是1.8,然后可能是之后安装了GCC吧,他大爷的,java版本变成了1.5.这个残酷的事实是在我写练习Package的测试文件的时候搞得. 机智的看了一下j ...