码迷,mamicode.com
首页 > 其他好文 > 详细

拯救小矮人

时间:2019-10-25 20:09:17      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:code   个人   namespace   ons   代码   get   str   while   背包   

思路: 贪心 + dp

首先贪心按身长加手长排序, 也就是让最难出去的先出去

但也有可能有人手短身子长, 那他奉献自己可能更优

所以在加个背包dp

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 2005;
const int H = 100500;
int dp[H], n, h; // dp[i] 表示出去i个人最高的高度
struct node{
    int a, b;
    bool operator < (const node &i) const {
        return a + b < i.a + i.b;
    }
}p[N];
int read(void) {
    int x = 0; char c = getchar();
    while (!isdigit(c)) c = getchar();
    while (isdigit(c)) {
        x = (x << 3) + (x << 1) + c - '0';
        c = getchar();
    }
    return x;
}

int main() {
    n = read();
    for (int i = 1;i <= n; i++) p[i].a = read(), p[i].b = read();
    h = read();
    sort(p + 1, p + n + 1); 
    for (int i = 1;i <= n; i++) dp[i] = -0x3f3f3f3f, dp[0] += p[i].a;
    // 每个人的体积为1, 价值为a
    for (int i = 1;i <= n; i++) 
        for (int j = i;j >= 1; j--) 
            if (dp[j-1] + p[i].b >= h)
                dp[j] = max(dp[j], dp[j-1] - p[i].a);
    for (int i = n;i >= 0; i--) 
        if (dp[i] >= 0) {
            cout << i << endl;
            return 0;
        }
    return 0;
}

拯救小矮人

标签:code   个人   namespace   ons   代码   get   str   while   背包   

原文地址:https://www.cnblogs.com/Hs-black/p/11739915.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!