题目链接: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 SOLUTION “玲珑杯”ACM比赛 Round #15 Submit summary Discuss
解析:二分最低商品的最大价值,然后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; }