解题思路
2025-10-26 09:28:40
发布于:浙江
3阅读
0回复
0点赞
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
int main() {
int N, L;
cin >> N >> L;
vector<int> c(N), l(N);
for (int i = 0; i < N; i++) {
cin >> c[i] >> l[i];
}
// dp[j] 表示获得至少 j 毫升容量的最小费用
const long long INF = LLONG_MAX / 2; // 防止溢出
vector<long long> dp(L + 1, INF);
dp[0] = 0;
// 0-1背包
for (int i = 0; i < N; i++) {
// 倒序遍历
for (int j = L; j >= 0; j--) {
if (dp[j] == INF) continue;
int new_j = j + l[i];
if (new_j >= L) {
// 如果加上当前饮料后容量超过L,都视为达到L
dp[L] = min(dp[L], dp[j] + c[i]);
} else {
// 如果还没达到L,正常更新
dp[new_j] = min(dp[new_j], dp[j] + c[i]);
}
}
}
if (dp[L] != INF) {
cout << dp[L] << endl;
} else {
cout << "no solution" << endl;
}
return 0;
}
这里空空如也







有帮助,赞一个