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 ...
随机推荐
- python 查询,子查询以及1对多查询
1.添加数据: # 方法1:对象.save() book = Book(**kwargs) book.save() # 方法2:类.create(**kwargs) Book.create(**kwa ...
- 面向对象在JavaScript中的接口实现
接口是面向对象编程的基础.它是一组包括了函数型方法的数据结构,与类一样.都是编程语言中比較抽象的概念.比方生活中的接口.机顶盒.人们利用它来实现收看不同频道和信号的节目,它宛如对不同类型的信息进行集合 ...
- 如何在VS2010中添加ActiveX控件及使用方法
方法1: 1.首先在在项目上面右击添加类,如下图所示: 2.点击添加ActiveX控件中的MFC类 3.找到需要添加的ActiveX类. 4.点击完成即可. 5.此时转到资源视图,打开如下视图.可能工 ...
- 深入了解Struts1的执行机理
要说Struts1的工作流程.就必需要说一下Model1和Model2了.由于这个框架是踏着他们的尸骨一步一步的发展起来的. Model1开发模式,想想我们刚刚開始接触Java的时候,我们用的就是这样 ...
- 开发ActiveX控件调用另一个ActiveX系列3——ActiveX调用另一个ActiveX
终于进入正题了,怎样在ActiveX中调用另一个ActiveX.我们的项目需要调用华视电子身份证识别仪的ActiveX控件 在这里有很多识别仪ActiveX插件下载:http://www.idukaq ...
- servletRequest 常用操作
package request; import java.io.IOException;import javax.servlet.ServletException;import javax.servl ...
- 身份证归属地查询免费api接口代码
描写叙述 :依据身份证编号 查询归属地信息. 身份证实体类: package org.wx.xhelper.model; /** * 身份证实体类 * @author wangxw * @versio ...
- Zend API:深入 PHP 内核
Introduction Those who know don't talk. Those who talk don't know. Sometimes, PHP "as is" ...
- Docker入门系列7 动态映射端口port mapping
为何想要动态映射端口呢? 因为刚开始run启动容器时,并不知道里面需要映射哪些端口,等容器已创建了,想映射端口. 当然可以通过先commit成镜像,然后再次run时指定端口,但会生成中间的镜像,对于有 ...
- 微信小程序页面布局之弹性布局-Flex介绍
布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现. 2009年,W3C 提出了一种新 ...