首页 > 代码库 > 玲珑杯 1125 咸鱼商店
玲珑杯 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\n",ans); return 0; }
玲珑杯 1125 咸鱼商店
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。