爷爷要过生日了,小明希望给他准备一份生日礼物,预算大约为m元。已知有n件礼物可以挑选,第i 件的价格为p[i]元。请挑选其中的一件,价钱最好是越接近m元越好,如果有两个礼物同样接近m 元,挑选贵的那件。请输出最终礼物的价格。 c++代码
时间: 2024-10-21 15:15:21 浏览: 30
这是一个经典的动态规划问题,通常可以使用贪心策略来解决,也可以称为“最接近”问题。以下是使用C++实现的一个简单版本:
```cpp
#include <iostream>
#include <vector>
using namespace std;
int nearestSmallerOrEqual(vector<int>& p, int m) {
vector<int> dp(m + 1, INT_MAX); // 初始化dp数组,所有值初始化为最大整数
for (int i = 0; i < p.size(); i++) { // 遍历礼物价格
if (p[i] <= m) { // 如果价格小于等于m
for (int j = m; j >= p[i]; j--) { // 从m开始向下调整,找到第一个大于等于当前价格的位置
dp[j] = min(dp[j], p[i]); // 更新dp数组,选择较小的值
}
}
}
return dp[m]; // 返回m位置的dp值,即最接近且不超过m的价格
}
int main() {
int n, m;
cin >> n >> m; // 输入礼物数量和预算
vector<int> prices(n);
for (int i = 0; i < n; i++) {
cin >> prices[i];
}
int result = nearestSmallerOrEqual(prices, m);
cout << "小明最终会选择价格为 " << result << " 元的礼物给爷爷庆祝生日。" << endl;
return 0;
}
```
在这个程序中,`nearestSmallerOrEqual`函数用于计算最接近给定预算且不超过预算的价格。通过动态规划,我们不断更新dp数组,使其保持到目前为止每个价位能找到的最优礼物价格。
阅读全文
相关推荐
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![text/x-c](https://img-home.csdnimg.cn/images/20250102104920.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![java](https://img-home.csdnimg.cn/images/20250102104920.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![ppt](https://img-home.csdnimg.cn/images/20241231044937.png)
![ppt](https://img-home.csdnimg.cn/images/20241231044937.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)