玲珑杯 1125 咸鱼商店

SAMPLE INPUT
3 10 1
1 2
10 1
5 5
SAMPLE OUTPUT
5
对价值排序,每次二分价值,剩下的就是一个典型的01背包问题。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <cmath>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#define lowbit(x) (x&(-x))
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.141592653589793238462
#define INF 0x3f3f3f3f3f
#define mem(a) (memset(a,0,sizeof(a)))
typedef long long ll;
int n,m,k,ans;
int dp[1006];
struct Node
{
    int cost;
    int val;
    friend bool operator<(const Node &a,const Node &b)
    {
        return a.val>b.val;
    }
}node[1006];
int check(int mid)
{
    int i;
    memset(dp,0,sizeof(dp));
    for(i=0;i<n;i++)
    {
        if(node[i].val<mid) break;
        for(int j=m;j>=node[i].cost;j--)
        {
            dp[j]=max(dp[j],dp[j-node[i].cost]+node[i].val);
        }
    }
    for(int i=0;i<=m;i++)
    {
        if(dp[i]>=k)
        {
            return 1;
        }
    }
    return 0;
}
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for(int i=0;i<n;i++)
    {
        scanf("%d%d",&node[i].cost,&node[i].val);
    }
    sort(node,node+n);
    int l=0,r=1000000,ans=-1;
    while(l<=r)
    {
        int mid=(l+r)>>1;
        if(check(mid)==1)
        {
            ans=mid;
            l=mid+1;
        }
        else r=mid-1;
    }
    printf("%d
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/7219395.html