1704 叠罗汉

描述:

今天光棍节,北航寺的兄弟们又无聊了,于是他们聚在一起想找点乐子。考虑到直接到别人学校到处转会影响本寺形象,于是老大决定,我们叠罗汉,利用叠起来的高度看
看能不能实现今年过节不收礼,明年收礼不过节的美好愿望
当然,每个人都有一个承受能力值和重量,显然,叠起来以后,最下面的人是要承受所有上面人的重量合的。同时,自己也要承受自己的重量

输入

数字T,代表数据组数
数字N,代表有多少个北航寺的同学
紧接N行,每行2个数字,分别代表第I个同学的重量和承重能力
(T<=10,N<=1111,保证每个同学有特定的能力值和重量)

输出

罗汉最多叠多高(每个人高度值均为1)

样例输入

1
4
300 1000
1000 1200
200 600
100 101

样例输出

3

 

经典的动态规划题


#include <iostream>
#include <algorithm>
#include "stdio.h"
using namespace std;
#define MAX 200000000
struct node{
    int w, l;
};
node a[1115];
bool cmp(node a, node b)
{
    return a.l < b.l;
}
int dp[1114][1114];
int main()
{
    int t;
    scanf("%d", &t);
    int i, j;
    while(t --)
    {
        int n;
        scanf("%d", &n);
        for(i = 1; i != n+1; i ++)
            scanf("%d%d", &a[i].w, &a[i].l);
        sort(a + 1, a + n + 1, cmp);
        for(i = 1; i != n+1; i ++)
        {
            dp[0][i] = MAX;
            dp[i][0] = 0;
        }
        dp[0][0] = 0;
        for(i = 1; i != n+1; i ++)
            for(j = 1; j != n+1; j ++)
            {
                if(dp[i-1][j] < dp[i-1][j-1]+a[i].w)
                    dp[i][j] = dp[i-1][j];
                else
                {
                    dp[i][j] = dp[i-1][j-1] + a[i].w;
                    if(dp[i][j] > a[i].l)
                        dp[i][j] = dp[i-1][j];
                }
            }
        for(i = n; i != -1; i --)
            if(dp[n][i] != MAX)
                break;
        printf("%d\n", i);
    }
    return 0;
}


 

 

 

 

你可能感兴趣的:(1704 叠罗汉)