zoukankan      html  css  js  c++  java
  • Weights and Measures (贪心+dp)

    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即可,状态转移方程dp[t][j] = min(dp[t][j], dp[t-1][j-1] +p[t].a)。

    代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #define INF 0x3f3f3f3f
    using namespace std;
    
    struct node {
    	int a,b;
    
    } p[10005];
    long long int dp[10005][10005];
    bool cmp(node x,node y)
    {
    	return x.b<y.b;
    }
    int main() {
    	int n=1;
    	while(scanf("%d%d",&p[n].a,&p[n].b)!=EOF) {
    		n++;
    	}
        n--;
        for(int t=0;t<=n;t++)
        {
        	for(int j=1;j<=n;j++)
        	{
        		dp[t][j]=INF;
    		}
    	}
    	sort(p+1,p+n+1,cmp);
        for (int t = 1; t <= n; t ++)
    	for (int j = 1; j <= t; j ++) {
    	    dp[t][j] = dp[t-1][j];
    	    if (dp[t-1][j - 1] + p[t].a <= p[t].b && dp[t-1][j-1] !=INF)
    		dp[t][j] = min(dp[t][j], dp[t-1][j-1] +p[t].a);
    	}
        int flag;
    	for(int k=n;k>=1;k--)
    	{
    		if(dp[n][k]!=INF)
    		{
    			flag=k;
    			break;
    		}
    	}
        printf("%d
    ",flag);
    	return 0;
    }
  • 相关阅读:
    运算符
    java--有关前台展示图片流的用法
    TortoiseSVN--Subversion客户端使用详解及问题解决
    SVN 文件的解锁方法
    JDBC中获取数据表的信息
    tomcat配置文件解决乱码问题
    正则表达式常用匹配
    Java:如何选择最为合适的Web开发框架
    键盘enter事件 兼容FF和IE和Opera
    PayPal 支付接口详解
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781985.html
Copyright © 2011-2022 走看看