题目链接: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. mycat 分页慢原理解析、mycat跨事务解惑、mycat注解调用存储过程分析

    1结合Mycat日志,分析select * from travelrecord order by id limit100000,100 的运行过程,解释下当limit M,N中的M非常大的情况下.为什 ...

  2. java查看工具jmap-windows

    Prints shared object memory maps or heap memory details for a process, core file, or remote debug se ...

  3. CSU - 1556 Jerry&#39;s trouble(高速幂取模)

    [题目链接]:click here [题目大意]:计算x1^m+x2^m+..xn^m(1<=x1<=n)( 1 <= n < 1 000 000, 1 <= m < ...

  4. 上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二)

    上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二) 前几篇博文中给大家介绍了一下APP中的基本业务及开发本项目使用的网络架构: 上门洗车APP --- Androidc ...

  5. js高度line-height及宽度text-align:center居中插件

    1.高度居中---在高度设为100%,无法直接使用line-height:100%;会不起效果 这是用于应对height:100%的插件 /** * 高度居中函数,用于应对高度设为100%时的居中 * ...

  6. 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  7. Hadoop关于Wrong FS错误

    关于使用java api上传文件. 在定义一个FileSystem变量的时候伪分布式和单机版的方法是不一样的,单机版使用的是FileSystem类的静态函数 FileSystem hdfs = Fil ...

  8. 深入Asyncio(二)从线程到协程

    线程的真相 多线程并不是一无是处,在实际问题中,要权衡优劣势来选择多线程.多进程或是协程.协程为多线程的某些问题提供了一种解决方案,所以学习协程首先要对线程有一定了解. 多线程优点 代码可读性 多线程 ...

  9. spring AOP(切面)

    AOP 基本概念cross  cutting concern横切性关注点:独立服务,遍布在系统处理流程之中 Aspect对横切关注点模块化 advice对横切关注点具体实现 pointcut定义adv ...

  10. Linux 命令汇总总结相关

    玩了linux快一年,简单总结下网络相关的命令,具体每个命令的参数可以用到再细看. 1.ifconfig:查询.设置网卡和IP网段等相关参数,包括MTU.2.ifup.ifdown:这两个命令就是一个 ...