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; }