1125 - 咸鱼商店(二分+01背包)

题目链接:http://www.ifrog.cc/acm/problem/1125

1125 - 咸鱼商店

Time Limit:3s Memory Limit:256MByte

Submissions:250Solved:106

DESCRIPTION

你现在在咸鱼商店,你有M元钱。咸鱼商店有N个物品,每个物品有两个属性,一个是他的价格S[i],另外一个是他的价值V[i]。现在你想买一些物品,使得这些物品的价值和大于等于K,并且使得其中价值最低的商品的价值尽量高。请你输出这个最大价值。

INPUT
第一行三个整数N,M,K。接下来N行,每行两个整数S和V,分别表示价格和价值。满足:1 <= N, M, S <= 10^3, 0 <= V, K <= 10^6
OUTPUT
输出价值最低的商品能够达到的最大价值。如果无解,输出-1
SAMPLE INPUT
3 10 1
1 2
10 1
5 5
SAMPLE OUTPUT
5


解析:二分最低商品的最大价值,然后01背包

代码:

#include<bits/stdc++.h>
#define N 1009
using namespace std;

const int INF = 0x3f3f3f3f;

struct node
{
    int w, v;
}p[N];
int dp[N], ans[N];

int main()
{
    int n, W, k, L, R, mid;
    scanf("%d%d%d", &n, &W, &k);
    R = -INF; L = -1;
    for(int i = 1; i <= n; i++)
    {
        scanf("%d%d", &p[i].w, &p[i].v);
        R = max(R, p[i].v);
    }
    while(L < R)
    {
        mid = (L+R)>>1;
        memset(dp, 0, sizeof(dp));
        for(int i = 1; i <= n; i++)
        {
            if(p[i].v < mid) continue;
            for(int j = W; j >= p[i].w; j--)
            {
                dp[j] = max(dp[j], dp[j - p[i].w] + p[i].v);
            }
        }
        if(dp[W] >= k) L = mid + 1;
        else R = mid - 1;
    }

    printf("%d\n", L);
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值