武松又双叒叕来景阳冈喝酒了,老规矩,酒老板还是给他出了个难题:老板指着店里的酒说,现在酒全部装瓶了,每个瓶上都标着酒的重量和价格,要喝就得整瓶买,不单卖。武松打完老虎刚拿到大笔赏金,表示钱不是问题,要喝个痛快。但是酒量有限,最多只能喝五斤,喝醉了可不好。那么,武松如果想在酒量范围内喝到更多更好的酒,应该怎么选呢? 输入格式: 首先在第一行里输入酒的数量N,武松的酒量M,N不超过100,M不超过50。 其后的N行,分别输入店里的酒的重量和价格,以空格隔开。 输出格式: 对每一组输入,首先输出武松能喝到的酒的最大价值The max price is XX。第二行输出选择的酒的编号Choose: XX YY ZZ,如果没有合适的酒可以喝,则输出There is no proper wine.。
时间: 2024-03-10 15:47:04 浏览: 152
好的,根据您提供的问题,我来回答。这是一个经典的背包问题,可以使用动态规划来解决。具体思路为:对于每个酒,我们可以选择放或者不放到背包中,如果放入,则需要考虑可用的酒量和当前酒的重量是否超过限制,以及当前价值是否更高,如果更高则更新当前最大价值和选择的酒的编号。最终输出最大价值和选择的酒的编号即可。以下是示例代码:
```
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Wine {
int weight;
int price;
int id;
};
bool cmp(Wine a, Wine b) {
return a.price > b.price;
}
int main() {
int n, m;
while (cin >> n >> m) {
vector<Wine> wines(n);
for (int i = 0; i < n; i++) {
cin >> wines[i].weight >> wines[i].price;
wines[i].id = i + 1;
}
sort(wines.begin(), wines.end(), cmp);
vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));
vector<vector<int>> choice(n + 1, vector<int>(m + 1, 0));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (wines[i - 1].weight > j) {
dp[i][j] = dp[i - 1][j];
} else {
int v1 = dp[i - 1][j];
int v2 = dp[i - 1][j - wines[i - 1].weight] + wines[i - 1].price;
if (v2 > v1) {
dp[i][j] = v2;
choice[i][j] = 1;
} else {
dp[i][j] = v1;
}
}
}
}
int max_price = dp[n][m];
if (max_price == 0) {
cout << "There is no proper wine." << endl;
} else {
cout << "The max price is " << max_price << "." << endl;
vector<int> chosen;
int i = n, j = m;
while (i > 0 && j > 0) {
if (choice[i][j] == 1) {
chosen.push_back(wines[i - 1].id);
j -= wines[i - 1].weight;
}
i--;
}
sort(chosen.begin(), chosen.end());
cout << "Choose:";
for (int i = 0; i < chosen.size(); i++) {
cout << " " << chosen[i];
}
cout << endl;
}
}
return 0;
}
```
阅读全文