| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 455 人关注过本帖
标题:请问这个问题有方法做出来吗
只看楼主 加入收藏
没钱吃饭
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-7-28
收藏
 问题点数:0 回复次数:7 
请问这个问题有方法做出来吗
在区间中(0-11],(11-22],(22-33]中,分别取a,b,c个数(a,b,c由键盘输入),a+b+c=6,再由键盘输入一个数sum,输出所有满足a,b,c个数的数值之和为和数sum的数。
(例如输入 1 2 3 (在0-11取 1个数,11-22取2个数,22-33取3个数)
           101 (sum)
 输出  1 12 27 28 33
        ......
 
搜索更多相关主题的帖子: 键盘 
2015-07-28 11:20
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
例如输入 1 2 3 (在0-11取 1个数,11-22取2个数,22-33取3个数)
           101 (sum)
输出  1 12 27 28 33

----------------- “1 12 27 28 33”中,在“11-22”间只取了一个数12呀
2015-07-28 13:58
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
我以暴力方式遍历了一下
程序代码:
#include <vector>
#include <algorithm>
#include <cstdio>

int main( void )
{
    const std::vector<int> as = {  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11 };
    const std::vector<int> bs = { 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22 };
    const std::vector<int> cs = { 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33 };
    const size_t a = 1;
    const size_t b = 2;
    const size_t c = 3;
    const int sum = 101;

    {
        auto sumfun = []( const std::vector<int>& s, const std::vector<bool>& mask )
        {
            int sum = 0;
            for( size_t i=0; i!=mask.size(); ++i )
                if( mask[i] )
                    sum += s[i];
            return sum;
        };

        std::vector<bool> asp( as.size(), false );
        for( size_t i=0; i!=a; ++i ) asp.at(as.size()-i-1)=true;
        do
        {
            int sum_a = sumfun( as, asp );

            std::vector<bool> bsp( bs.size(), false );
            for( size_t i=0; i!=b; ++i ) bsp.at(bs.size()-i-1)=true;
            do
            {
                int sum_b = sumfun( bs, bsp );

                std::vector<bool> csp( cs.size(), false );
                for( size_t i=0; i!=c; ++i ) csp.at(cs.size()-i-1)=true;
                do
                {
                    int sum_c = sumfun( cs, csp );

                    if( sum_a+sum_b+sum_c == sum )
                    {
                        for( size_t i=0; i!=asp.size(); ++i ) if(asp[i]) printf( "%d ", as[i] );
                        for( size_t i=0; i!=bsp.size(); ++i ) if(bsp[i]) printf( "%d ", bs[i] );
                        for( size_t i=0; i!=csp.size(); ++i ) if(csp[i]) printf( "%d ", cs[i] );
                        printf( "\n" );
                    }

                } while( std::next_permutation(csp.begin(),csp.end()) );

            } while( std::next_permutation(bsp.begin(),bsp.end()) );

        } while( std::next_permutation(asp.begin(),asp.end()) );
    }

    return 0;
}
输出:
4 12 13 23 24 25
3 12 14 23 24 25
3 12 13 23 24 26
2 13 14 23 24 25
2 12 15 23 24 25
2 12 14 23 24 26
2 12 13 23 25 26
2 12 13 23 24 27
1 13 15 23 24 25
1 13 14 23 24 26
1 12 16 23 24 25
1 12 15 23 24 26
1 12 14 23 25 26
1 12 14 23 24 27
1 12 13 24 25 26
1 12 13 23 25 27
1 12 13 23 24 28


[ 本帖最后由 rjsp 于 2015-7-28 14:46 编辑 ]
2015-07-28 14:38
自傲
Rank: 2
等 级:论坛游民
帖 子:53
专家分:95
注 册:2015-5-16
收藏
得分:0 
2015-07-28 15:10
无烟办公室
Rank: 1
等 级:新手上路
帖 子:2
专家分:1
注 册:2015-7-28
收藏
得分:0 
回复 3楼 rjsp
我写不出来,感觉你的程序不是很符合题意。但是你很厉害
2015-07-28 15:15
没钱吃饭
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-7-28
收藏
得分:0 
回复 2楼 rjsp
...这里错了,就是想举个例子
2015-07-28 15:30
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:0 
其实可以看做取6个数,不过这六个数呈一个分布,个人觉得不需要完全遍历

一片落叶掉进了回忆的流年。
2015-07-28 15:41
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:0 
把所有数在所在范围内取最大,如果恰好等于sum那么就只有唯一一种组合,如果小于sum那么就不存在,如果大于sum就可以从这6个数中分别减得到不同组合

一片落叶掉进了回忆的流年。
2015-07-28 15:46
快速回复:请问这个问题有方法做出来吗
数据加载中...
 
   



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

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