使用QT完成,一个金额为20319.14元(每个月可能不一样),单价固定有7或8种(0.75, 0.85, 1.72, 2.35, 2.75, 2.77, 3.20可以选1个单价或多个单价),求出数量(数量要为整数),求来的金额要与要求的20319.14最接近的算法
时间: 2024-10-13 12:09:26 浏览: 18
Qt5.12.8-ARM-Off-line 适用与银河麒麟V10 ps1;离线安装包
在Qt中计算这种情况通常涉及到找到一个优化问题的解决方案,即如何通过组合价格和数量来尽量接近目标金额,同时保证数量是整数。这个问题可以转化为一个线性规划或者近似算法,例如动态规划或贪心策略。
这里提供一种简化版的思路:
1. **初始化**:创建一个字典或数组,存储每种单价对应的最小数量,初始时全部设置为无限大,因为没有商品时数量默认为无穷大。
2. **遍历**:对于每个单价,从最大数量开始尝试减去直到满足总金额。更新每种单价对应的最大数量,如果当前总金额加上剩余的单价乘以1可以达到或超过目标金额,就记录下这个数量和总价。
3. **搜索最优解**:在所有可能的组合中查找使得总金额最接近20319.14且数量是整数的方案。你可以使用二分查找法来快速找到最接近的目标值。
4. **算法实现**:在Qt的QVector或QHashTable等数据结构中存储并遍历结果,找出符合条件的那个组合。
```cpp
// 假设我们有一个价格数组和目标金额
const QVector<double> prices = {0.75, 0.85, ...};
double targetAmount = 20319.14;
int totalQuantity;
// 更新最小数量字典
for (double price : prices) {
int minCount = INT_MAX;
double currentTotal = targetAmount - price * 1; // 试图减少1单位的量
for (int count : range(minCount, ceil(targetAmount / price))) { // 试遍所有可能的数量
if (currentTotal <= targetAmount) {
minCount = count;
break;
}
}
// 更新字典
// (price, minCount)
}
// 找到最接近的整数组合
double closestAmount = targetAmount;
totalQuantity = 0;
for (auto& pair : priceToMinCount) {
int count = std::min(totalQuantity + pair.second, minCount); // 考虑已有的数量限制
if (abs(pair.first * count - closestAmount) < abs(totalAmount - closestAmount)) {
closestAmount = pair.first * count;
totalQuantity = count;
}
}
```
阅读全文