| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5252 人关注过本帖, 1 人收藏
标题:关于分酒问题
只看楼主 加入收藏
bibiamn
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2017-5-19
收藏(1)
 问题点数:0 回复次数:8 
关于分酒问题
有一只装满12斤酒的瓶子和三只分别装10斤、6斤和3斤酒的空瓶,如何进行三等份、四等份。如果4个瓶子分别要求装5斤、3斤、2斤、2斤,能否实现?
各位大神帮帮忙看下,网上给的解题思路都是用三个瓶子的,现在是四个瓶子,要怎么用DFS或者二元一次方程求解呢?能不能给出模型参考下,不要都是代码哦
搜索更多相关主题的帖子: 模型 如何 网上 
2017-05-20 13:16
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
先要弄清楚三个瓶子和四个瓶子的解法有什么区别~之前有一个类似的帖子也是三个瓶子的~数学模型要弄弄看才行~到底还是算法问题~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-20 14:36
bibiamn
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2017-5-19
收藏
得分:0 
回复 2楼 九转星河
想找3个和4个之间的关系但是找不到 而且第二题还推广为n个瓶子了 尴尬
2017-05-20 15:04
beichei5d
Rank: 4
等 级:业余侠客
威 望:2
帖 子:89
专家分:270
注 册:2016-3-8
收藏
得分:0 
感觉这其实是个数学问题 。。

你现在所偷的懒,都将成为以后扇你的巴掌!共勉吧。。。
2017-05-20 15:34
bibiamn
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2017-5-19
收藏
得分:0 
回复 4楼 beichei5d
是阿数学建模
2017-05-20 15:49
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 5楼 bibiamn
我也参加了数学建模~不过这条题没啥时间思考了~毕竟不是两下子就可以做出来的~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-20 17:47
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
复杂的算法我也不会,就用了最简单的广度优先搜索

程序代码:
#include <iostream>
#include <vector>
#include <queue>
#include <set>

bool bar( unsigned char a0, unsigned char a1, unsigned char a2, unsigned char a3
         , unsigned char b0, unsigned char b1, unsigned char b2, unsigned char b3
         , unsigned char c0, unsigned char c1, unsigned char c2, unsigned char c3 );

int main( void )
{
    bar( 12,0,0,0,  12,10,6,3,  4,4,4,0 );
    // 输出
    // 12      0       0       0
    // 2       10      0       0
    // 2       4       6       0
    // 2       1       6       3
    // 8       1       0       3
    // 11      1       0       0
    // 11      0       0       1
    // 1       10      0       1
    // 1       4       6       1
    // 1       4       4       3
    // 4       4       4       0

    bar( 12,0,0,0,  12,10,6,3,  3,3,3,3 );
    // 输出
    // 12      0       0       0
    // 6       0       6       0
    // 3       0       6       3
    // 3       3       6       0
    // 3       3       3       3

    bar( 12,0,0,0,  12,10,6,3,  5,3,2,2 );
    // 输出
    // 无法移动

    return 0;
}

struct foo
{
    unsigned char a[4]; // 当前容量
    static unsigned char b[4]; // 最大容量
    static unsigned char c[4]; // 最终容量

    foo( unsigned char a0, unsigned char a1, unsigned char a2, unsigned char a3 )
    {
        a[0]=a0, a[1]=a1, a[2]=a2, a[3]=a3;
    }

    bool operator<( const foo& other ) const
    {
        for( size_t i=0; i!=4; ++i )
        {
            if( a[i] < other.a[i] ) return true;
            if( a[i] > other.a[i] ) return false;
        }
        return false;
    }

    bool move( size_t from, size_t to )
    {
        if( from!=to && a[from]!=0 && a[to]!=b[to] )
        {
            unsigned char tmp = std::min( a[from], (unsigned char)(b[to]-a[to]) );
            a[from] -= tmp;
            a[to] += tmp;
            return true;
        }
        return false;
    }

    bool isok( void ) const
    {
        for( size_t i=0; i!=4; ++i )
            if( a[i] != c[i] ) return false;
        return true;
    }
};
unsigned char foo::b[4];
unsigned char foo::c[4];

std::ostream& operator<<( std::ostream& os, const foo& f )
{
    return os << (unsigned)f.a[0] << '\t' << (unsigned)f.a[1] << '\t' << (unsigned)f.a[2] << '\t' << (unsigned)f.a[3] << '\n';
}

bool bar( unsigned char a0, unsigned char a1, unsigned char a2, unsigned char a3
         , unsigned char b0, unsigned char b1, unsigned char b2, unsigned char b3
         , unsigned char c0, unsigned char c1, unsigned char c2, unsigned char c3 )
{
    foo::b[0]=b0, foo::b[1]=b1, foo::b[2]=b2, foo::b[3]=b3;
    foo::c[0]=c0, foo::c[1]=c1, foo::c[2]=c2, foo::c[3]=c3;

    std::queue<std::vector<foo>> steps;
    steps.push( std::vector<foo>(1,foo(a0,a1,a2,a3)) );

    if( steps.back().back().isok() )
    {
        std::cout << "不需要移动\n" << std::endl;
        return true;
    }

    std::set<foo> unique;
    unique.insert( steps.back().back() );

    while( !steps.empty() )
    {
        for( size_t i=0; i!=4; ++i )
        {
            for( size_t j=0; j!=4; ++j )
            {
                foo new_foo = steps.front().back();
                if( new_foo.move(i,j) ) // 可移
                {
                    if( unique.insert(new_foo).second ) // 这种状态之前未出现过
                    {
                        steps.push( steps.front() );
                        steps.back().push_back( new_foo );

                        if( new_foo.isok() ) // 符合要求
                        {
                            for( std::vector<foo>::const_iterator itor=steps.back().begin(); itor!=steps.back().end(); ++itor )
                                std::cout << *itor;
                            std::cout << std::endl;
                            return true;
                        }
                    }
                }
            }
        }

        steps.pop();
    }

    std::cout << "无法移动\n" << std::endl;
    return false;
}

2017-05-22 10:37
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 7楼 rjsp
难得r版写那么大型的程序~真是辛苦了~~我也觉得用广搜就足够了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-22 11:40
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
回复 8楼 九转星河
:)
2017-05-22 17:55
快速回复:关于分酒问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020330 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved