每个输入包含一个测试用例。
输入的第一行包括两个正整数,表示股票的种数N(1<=N<=1000)和牛牛借的钱数M(1<=M<=1000)。
接下来N行,每行包含两个正整数,表示这只股票每一股的买入价X(1<=X<=1000)和卖出价Y(1<=Y<=2000)。
每只股票可以买入多股,但必须是整数。
输出一个整数表示牛牛最多能赚的钱数。
3 5 3 6 2 3 1 1
4
#include<bits/stdc++.h> using namespace std; int main() { int N, M; cin >> N >> M; vector<int> dp(M + 1); // dp[i] 表示投资 i 元最多赚多少钱 while (N--) { int X, Y, d; cin >> X >> Y; d = Y - X; if (d <= 0) continue; for (int i = X; i <= M; i++) { dp[i] = max(dp[i], dp[i - X] + d); } } cout << dp[M] << endl; return 0; }
#include <bits/stdc++.h> using namespace std; typedef pair<int, int> PII; int main() { int n, m; scanf("%d%d", &n, &m); vector<int> dp(m + 1); vector<PII> goods; // 多重背包求解 for(int i = 0; i < n; i++) { int v, w; scanf("%d%d", &v, &w); int s = m / v; w -= v; for(int k = 1; k <= s; k <<= 1) { goods.push_back({k*v, k*w}); s -= k; } if(s > 0) goods.push_back({s*v, s*w}); } for(auto good: goods) { for(int j = m; j >= good.first; j--) { dp[j] = max(dp[j], dp[j - good.first] + good.second); } } printf("%d\n", dp[m]); return 0; }