• 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;
    }
  • 相关阅读:
    利用CWinThread实现跨线程父子MFC窗口
    GetForgroundWindow函数的不确定性——BUG笔记
    DLL动态链接库的创建
    php正则讲解 及与 js的正则比较
    cookie和session的讲解
    两种排序的方法 冒泡法 插入法 封装版
    php中获取当前时间
    文件下载及header方法介绍
    文件上传
    二分法封装版
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781985.html
Copyright © 2020-2023  润新知