开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 379|回复: 23
收起左侧

[已解决] 购买计算,剩余最少余额

 关闭 [复制链接]
结帖率:80% (20/25)
发表于 2025-5-21 22:31:07 | 显示全部楼层 |阅读模式   江苏省宿迁市
50精币
身上有145020.8元,商品1价格为57090.5元,商品2价格为16143.54元,商品3价格为15835.28元,商品4价格为9621.4元,商品5价格为8071.76
怎么买才剩余最少的钱,可以重复买,
比如买商品2买8个,商品3买1个
16143.54X8=129148.32
145020.8-129148.32-15835.28=37.2
剩余最少37.2元,该怎么用易语言

最佳答案

查看完整内容

根据楼主提供的例子 身上有145020.8元,商品1价格为57090.5元,商品2价格为16143.54元,商品3价格为15835.28元,商品4价格为9621.4元,商品5价格为8071.76元 怎么买才剩余最少的钱,可以重复买, 比如买商品2买8个,商品3买1个 16143.54X8=129148.32 145020.8-129148.32-15835.28=37.2 通过脚本计算得到 最优购买方案 -----商品5 × 1 = 8071.76商品4 × 1 = 9621.4商品3 × 6 = 95011.68商品2 × 2 = 32287.08----------------- ...

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
发表于 2025-5-21 22:31:08 | 显示全部楼层   山西省长治市
根据楼主提供的例子
身上有145020.8元,商品1价格为57090.5元,商品2价格为16143.54元,商品3价格为15835.28元,商品4价格为9621.4元,商品5价格为8071.76
怎么买才剩余最少的钱,可以重复买,
比如买商品2买8个,商品3买1个
16143.54X8=129148.32
145020.8-129148.32-15835.28=37.2


通过脚本计算得到
[color=rgba(0, 0, 0, 0.85)][backcolor=rgba(0, 0, 0, 0.04)]最优购买方案 -----商品5 × 1 = 8071.76商品4 × 1 = 9621.4商品3 × 6 = 95011.68商品2 × 2 = 32287.08----------------------总花费:144991.92剩余金额:28.88----------------------
[color=rgba(0, 0, 0, 0.85)][backcolor=rgba(0, 0, 0, 0.04)]

[color=rgba(0, 0, 0, 0.85)][backcolor=rgba(0, 0, 0, 0.04)]37.2并非为最优解
[color=rgba(0, 0, 0, 0.85)][backcolor=rgba(0, 0, 0, 0.04)]

[color=rgba(0, 0, 0, 0.85)][backcolor=rgba(0, 0, 0, 0.04)]

[color=rgba(0, 0, 0, 0.85)]脚本的核心逻辑是通过[color=var(--md-box-samantha-deep-text-color) !important]递归算法 + 穷举搜索[color=rgba(0, 0, 0, 0.85)]来尝试所有可能的商品购买组合,找到总花费最接近预算(剩余金额最少)的方案
核心思路:递归穷举所有组合
[color=rgba(0, 0, 0, 0.85)]对每个商品,从最大可能数量开始尝试(优先尝试高价组合,可能更快找到优解),通过递归逐层确定所有商品的数量,最终验证组合是否更优。
[color=rgba(0, 0, 0, 0.85)]每次找到更优的组合时(剩余金额更少),立即更新最佳余额[color=rgba(0, 0, 0, 0.85)]最佳组合[color=rgba(0, 0, 0, 0.85)],并通过显示结果[color=rgba(0, 0, 0, 0.85)]函数实时展示在界面上
[color=rgba(0, 0, 0, 0.85)]这个脚本的核心是[color=var(--md-box-samantha-deep-text-color) !important]暴力穷举所有可能的组合[color=rgba(0, 0, 0, 0.85)],通过递归逐层确定每个商品的购买数量,并用贪心策略(从大到小尝试数量)和剪枝(限制数量)优化计算量。
[color=rgba(0, 0, 0, 0.85)]虽然逻辑简单直接,但存在效率和精度问题,适合小规模问题(如 5 种商品、数量限制 20),但面对更多商品或无数量限制时需进一步优化算法。
[color=rgba(0, 0, 0, 0.85)]

计算最优组合.e (967.3 KB, 下载次数: 3)

评分

参与人数 1荣誉 +1 收起 理由
笨潴 + 1 热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!

查看全部评分

回复

使用道具 举报

结帖率:88% (80/91)
发表于 2025-5-22 09:32:02 | 显示全部楼层   江苏省苏州市
[C++] 纯文本查看 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>

struct Item {
    double price;
    int maxCount;  // 最大购买数量
};

struct Combination {
    std::vector<int> counts;  // 每种商品的购买数量
    double total;             // 总价
};

// 递归生成所有可能的组合
void generateCombinations(const std::vector<Item>& items, int index, Combination current, 
                          std::vector<Combination>& result, double budget) {
    if (index == items.size()) {
        if (current.total <= budget) {
            result.push_back(current);
        }
        return;
    }

    const Item& item = items[index];
    int maxCount = std::min(static_cast<int>(budget / item.price), item.maxCount);

    for (int count = 0; count <= maxCount; ++count) {
        Combination newComb = current;
        newComb.counts[index] = count;
        newComb.total += item.price * count;
        
        if (newComb.total > budget) continue;  // 剪枝:超出预算则跳过
        
        generateCombinations(items, index + 1, newComb, result, budget);
    }
}

int main() {
    double budget = 145020.8;
    std::vector<Item> items = {
        {57090.5, static_cast<int>(budget / 57090.5)},    // 商品1
        {16143.54, static_cast<int>(budget / 16143.54)},  // 商品2
        {15835.28, static_cast<int>(budget / 15835.28)},  // 商品3
        {9621.4, static_cast<int>(budget / 9621.4)},      // 商品4
        {8071.76, static_cast<int>(budget / 8071.76)}     // 商品5
    };

    // 初始化当前组合
    Combination initial;
    initial.counts.resize(items.size(), 0);
    initial.total = 0.0;

    // 生成所有可能的组合
    std::vector<Combination> combinations;
    generateCombinations(items, 0, initial, combinations, budget);

    // 找到最接近预算的组合
    double minRemainder = INT_MAX;
    const Combination* bestCombination = nullptr;

    for (const auto& comb : combinations) {
        double remainder = budget - comb.total;
        if (remainder >= 0 && remainder < minRemainder) {
            minRemainder = remainder;
            bestCombination = &comb;
        }
    }

    // 输出结果
    if (bestCombination) {
        std::cout << "最优购买方案:" << std::endl;
        for (size_t i = 0; i < items.size(); ++i) {
            if (bestCombination->counts > 0) {
                std::cout << "商品" << (i + 1) << " x " << bestCombination->counts 
                          << " = " << items.price * bestCombination->counts << "元" << std::endl;
            }
        }
        std::cout << "总价:" << bestCombination->total << "元" << std::endl;
        std::cout << "剩余金额:" << minRemainder << "元" << std::endl;
    } else {
        std::cout << "没有找到合适的购买组合。" << std::endl;
    }

    return 0;
}    
回复

使用道具 举报

签到天数: 1 天

发表于 2025-5-22 09:35:29 | 显示全部楼层   河南省周口市
这可太复杂了

补充内容 (2025-5-22 09:36):
数学太差,唉
回复

使用道具 举报

结帖率:80% (20/25)
 楼主| 发表于 2025-5-22 09:40:35 | 显示全部楼层   江苏省宿迁市
z13228604287 发表于 2025-5-22 09:32
[mw_shl_code=cpp,true]#include
#include
#include

哥,有E的代码吗?

点评

自己翻译啊! 自己动手的问题 答案已给你了   江苏省苏州市  发表于 2025-5-22 11:24
回复

使用道具 举报

结帖率:33% (1/3)
发表于 2025-5-22 09:45:23 | 显示全部楼层   山东省菏泽市
  
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
变量名类 型静态数组备 注
总金额双精度小数型 
花费双精度小数型 
剩余双精度小数型 
x2整数型 
x3整数型 
总金额 = 145020.8
x2 = 8  ' 商品2购买数量
x3 = 1  ' 商品3购买数量
' 计算总花费和剩余金额
花费 = x2 × 16143.54 + x3 × 15835.28
剩余 = 总金额 - 花费
信息框 (“最优购买方案:”#换行符“商品2:”到文本 (x2)“个”#换行符“商品3:”到文本 (x3)“个”#换行符“剩余金额:”到文本 (剩余), 0, “最少剩余”, )

回复

使用道具 举报

结帖率:80% (20/25)
 楼主| 发表于 2025-5-22 09:48:00 | 显示全部楼层   江苏省宿迁市
青春已不再 发表于 2025-5-22 09:45
[e=3].版本 2

.子程序 __启动窗口_创建完毕

哥,你这答案抄的的真好
回复

使用道具 举报

结帖率:33% (1/3)
发表于 2025-5-22 09:52:11 | 显示全部楼层   山东省菏泽市
769687520 发表于 2025-5-22 09:48
哥,你这答案抄的的真好

数学不行就抄答案呗!找个数学好的给你研究一下
回复

使用道具 举报

结帖率:100% (8/8)

签到天数: 1 天

发表于 2025-5-22 10:40:28 | 显示全部楼层   安徽省六安市
得方程吧
回复

使用道具 举报

结帖率:100% (9/9)

签到天数: 1 天

发表于 2025-5-22 10:46:26 | 显示全部楼层   江苏省无锡市
大概这个意思

最优购买.e

4.99 KB, 下载次数: 2

点评

不对 它要的是 组合购买方案   江苏省苏州市  发表于 2025-5-22 11:25
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表