I know, up on top you are seeing great sights,
But down at the bottom, we, too, should have rights.
We turtles can’t stand it. Our shells will all crack!
Besides, we need food. We are starving!” groaned Mack.
Mack, in an effort to avoid being cracked, has enlisted your advice as to the order in which turtles
should be dispatched to form Yertle’s throne. Each of the five thousand, six hundred and seven turtles
ordered by Yertle has a different weight and strength. Your task is to build the largest stack of turtles
possible.
Input
Standard input consists of several lines, each containing a pair of integers separated by one or more
space characters, specifying the weight and strength of a turtle. The weight of the turtle is in grams.
The strength, also in grams, is the turtle’s overall carrying capacity, including its own weight. That is,
a turtle weighing 300g with a strength of 1000g could carry 700g of turtles on its back. There are at
most 5,607 turtles.
Output
Your output is a single integer indicating the maximum number of turtles that can be stacked without
exceeding the strength of any one.
Sample Input
300 1000
1000 1200
200 600
100 101
Sample Output
3
题意:有几只乌龟,每只乌龟有一定的重量与力量。每只乌龟可以背小于它力量的重量(包括它自身的重量)。问最多一共可以有多少只乌龟叠在一起。

可以证明,将力量大的乌龟放在下面可以得到一个更优的状态。因此在dp之前应先将所有乌龟按力量大小排好序,力量小的在前面。
首先,我们不妨证明一下这个命题,如果一个力量小的乌龟可以驮着一个力量大的乌龟,那么这个力量大的乌龟也必然可以驮起这个力量小的乌龟,而且还能够使两个乌龟上方增加承重能力。

我们不妨设力量小的乌龟的重量和力量分别为w1、s1,而力量大的乌龟为w2、s2,由于乌龟1可以驮起乌龟2,那么有s1>=w1+w2,如果我们假设乌龟2驮不起乌龟1,那么就应该有s2<w1+w2,然而我们知道乌龟2的力量更大,所以应该有s2>s1>=w1+w2,这样就产生矛盾了,原命题得证。接着,如果乌龟1在乌龟2的下面,两龟上方的承重能力至多为s1-(w1+w2)。然而如果换成乌龟2在乌龟1的下面的话,对于乌龟1来讲是无所谓的,因为之前驮得动,现在少了乌龟2肯定也驮得动,因此仅从乌龟1的承重限制来讲,两龟上方的承重能力增加了。当然仅凭乌龟1的承重限制的角度来看是不全面的,我们还要考虑乌龟2,对于乌龟2来讲,两龟承重能力是s2-(w1+w2),而前面也说到了,乌龟1在下的时候承重能力至多为s1-(w1+w2),而s2-(w1+w2)>s1-(w1+w2),因此从乌龟2的角度来讲,尽管上面多了个乌龟1,但就乌龟1和乌龟2作为整体而言,他们上方的承重能力也一定增加了。因此,无论两龟整体的承重能力取决于哪只龟,调换之后最终的整体承重能力一定增加了。于是这样我们就可以先把乌龟按力量排序了,剩下的问题就是怎么求这个最长非降子序列了。

1.用dp[i][j]表示从前 i 只乌龟中选出 j 只可以得打的最小总重量。

转移方程为:如果dp[i-1][j-1]+t[i].w <=t[i].s,dp[i][j] = min( dp[i-1][j-1]+t[i].w, dp[i-1][j] ); 如果不等,则dp[i][j] = dp[i-1][j];

代码如下:

#include <iostream>
#include <cstdio>
#include <string.h>
#include <cmath>
#include <algorithm>
using namespace std;int dp[5650][5650];
typedef struct
{int w, s;
}tur;
tur t[5650];
int n;
bool comp( tur a, tur b)
{if( a.s <b.s||(a.s==b.s&& a.w< b.w))return true;return false;
}
int main()
{n=0;while( scanf("%d%d",&t[n].w,&t[n].s )!=EOF )n++;sort( t, t+n, comp);int i,j;memset( dp, 0x7f, sizeof( dp));for( i=0; i<=n; i++)dp[i][0] =0;for( i=1; i<=n; i++)for( j=1;j<=i; j++){if(dp[i-1][j] <dp[i][j])dp[i][j] =dp[i-1][j];if( dp[i-1][j-1]+t[i-1].w <=t[i-1].s &&dp[i-1][j-1]+t[i-1].w<dp[i][j] )dp[i][j] =dp[i-1][j-1]+t[i-1].w;}for( i=n; i>=0; i--)if( dp[n][i]<(1<<30))break;printf("%d\n",i);return 0;
}

努力加油a啊,(o)/~

Weights and Measures(贪心+动态规划)相关推荐

  1. UVA10154 Weights and Measures【0-1背包】

    I know, up on top you are seeing great sights, But down at the bottom, we, too, should have rights. ...

  2. 【UVA - 10154 】Weights and Measures (贪心排序,dp,类似0-1背包,状态设定思维)

    题干: The Problem Mack, in an effort to avoid being cracked, has enlisted your advice as to the order ...

  3. 贪心/动态规划 - 买卖股票的最佳时机含手续费

    题目链接 贪心 每次只能交易一个股票,最优的选择就是低买高卖.不过每次交易股票都有一次手续费.可以把手续费算到买入的价格里.只要能收益就交易. 每次卖出一个股票就拥有了原价购买股票的机会.这样就能在具 ...

  4. 贪心/动态规划 - 摆动序列

    摆动序列 题目链接 贪心 尽可能多的选择波峰波谷. class Solution {public:int wiggleMaxLength(vector<int>& nums) {i ...

  5. 1262. 可被三整除的最大和(贪心||动态规划)

    给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和. 示例 1: 输入:nums = [3,6,5,1,8] 输出:18 解释:选出数字 3, 6, 1 和 8,它们的和是 18(可被 ...

  6. 【数据结构与算法】【算法思想】【联系与区别】回溯 贪心 动态规划 分治

    4种算法思想比较与联系 如果将贪心,分治,回溯和动态规划四种算法思想分类,那贪心,回溯,动态规划可归为一类,而分治单独可以作为一类,因为它跟其他是三个都不大一样. 因为前三个算法解决问题的模型,都可以 ...

  7. [Leetcode][第44题][JAVA][通配符匹配][贪心][动态规划]

    [问题描述][困难] [解答思路] 1. 动态规划 第 1 步:设计状态 dp[i][j]dp[i][j] 表示字符串 ss 的前 ii 个字符和模式 pp 的前 jj 个字符是否能匹配 第 2 步: ...

  8. [Leedcode][JAVA][第55题][跳跃游戏][贪心][动态规划]

    [问题描述] 给定一个非负整数数组,你最初位于数组的第一个位置.数组中的每个元素代表你在该位置可以跳跃的最大长度.判断你是否能够到达最后一个位置.示例 1:输入: [2,3,1,1,4] 输出: tr ...

  9. LeetCode 435. 无重叠区间(贪心/动态规划)

    文章目录 1. 题目 2. 解题 2.1 贪心 2.2 动态规划 1. 题目 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠. 注意: 可以认为区间的终点总是大于它的起点. 区间 ...

最新文章

  1. 默的各种写法图片_SEO标题写法?
  2. 用Python分析了十年电影票房,原来我错过了这么多好电影!
  3. 11年瑞纳手动挡值多少钱_三分钟让你知道手中的松石值多少钱
  4. 何恺明最新一作论文:无监督胜有监督,迁移学习无压力,刷新7项检测分割任务...
  5. 线性一致性与全序广播------《Designing Data-Intensive Applications》读书笔记12
  6. Java实现大数乘法_java实现大数加法、乘法(BigDecimal)
  7. linux fedora14 u盘运行,Win7下Fedora 14 硬盘或U盘安装指南
  8. 如何计算和控制好项目开发成本?
  9. jsx怎么往js里传参数_给js文件传参数(详解)
  10. 《网络风险及网络安全》培训总结
  11. launchMode的几种模式
  12. C++STL标准模板库容器详细实现算法代码
  13. 用户管理系统_河北会计管理系统个人用户 使用手册
  14. html左侧浮动广告代码,网站侧边栏广告固定浮动效果的实现
  15. c语言中power是什么变量,c语言学习新手必看 power by vcok.com[转载]
  16. 百度将于今年下半年推出“哼唱搜索”
  17. 路由器刷openwrt后不能上网 修改brlan的ip地址失败
  18. 使用智遥工作流,优化SAP请购流程
  19. 弹性小球flash导航菜单源码
  20. 实施ERP系统后需要维护吗?

热门文章

  1. 安卓手机反应慢又卡怎么办_手机卡顿反应慢怎么解决?
  2. 看完让你理解WebSocket原理
  3. android自带中文字体,Android更换系统默认显示的字体使用自定义字体
  4. 去除bootstrap中input输入框的蓝色光
  5. 矽谷真假U盘测试软件,要闻回顾_科技时代_新浪网
  6. java包装类方法_Java包装类
  7. Android开发之高德地图定位成功返回的定位信息
  8. java+调用jacoco_java操作jacoco
  9. mysql大数据更新缓存_redis缓存mysql
  10. 编译maven_头条一面竟然问我Maven?