波松分酒问题 C++求最优解.

该博客介绍了如何用C++解决波松分酒问题,即如何仅用一个8品脱和一个5品脱的容器从12品脱啤酒中倒出6品脱。这个问题被转化为有向图的搜索问题,通过实现节点类并使用加减运算进行状态转移,最终找到从(12, 0, 0)到(6, 6, 0)的最短路径。" 111654378,10326456,Node.js V14.3.0 新特性:顶级Await支持与REPL增强,"['JavaScript', 'Node.js', '异步编程', '模块化', '编程工具']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
请设计程序解决“波松分酒问题”
问题如下:

某人有12品脱啤酒一瓶,想从中倒出6品脱,但他没有6品脱的容器,
仅有一个8品脱和一个5品脱的容器,怎样才能将啤酒分为两个6品脱?

抽象分析:

b = 大容器,也表示容积
s = 小容器,也表示容积
(f),(h),(e) 状态f=满, e=空, h=数字,表示容量

运算一: b(f) - s(e)  =>  b(b - s), s(f)
变例    b(h) - s(e)  =>  b(h - s), s(f)

运算二: b(e) + s(f)  =>  b(s), s(e)
变例    b(h) + s(f)  =>  b(f), s(s - b + h)

引出    b(f) - s(h)
        b(h) - s(h)

        b(e) + s(h)
        b(h) + s(h)

如果以瓶中酒的数量为节点, 通过一次以上运算可达到节点之间认为连通.
此题可转化为一个有向图的搜索问题.
即找出.指定节点(12, 0, 0) 和 (6, 6, 0)之间的最小路径.

*/
#include <cstdio>
#include <deque>
#include <map>
#include <utility>
#include <queue>

static int big_max_value[] =
{
    12, 8, 12
};
static int small_max_value[] =
{
    8, 5, 5
};
static const int big_offset[] =
{
    0, 1, 0
};
static const int small_offset[] =
{
    1, 2, 2
};


//节点定义
class Node
{
    unsigned char mBig;
    unsigned char mMid;
    unsigned char mSmall;

public:
    static void InitMaxValu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值