| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 949 人关注过本帖
标题:14个数,求其中几个数之和为一定数的方法。
只看楼主 加入收藏
abmdgg
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2013-8-23
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:14 
14个数,求其中几个数之和为一定数的方法。
已知:57.311,57.224,57.131,57.087,56.608,56.081,51.919,50.111,41.059,35.611,16.132,12.524,3.599,1.776.
求任几个数之和为279.448.
2013-08-23 10:06
awisebird_
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:82
专家分:185
注 册:2013-7-6
收藏
得分:0 
首先给14个数排序,然后再从2个数相加开始,3、4、5...舍掉明显不会成立的组合
2013-08-23 10:21
赵疯子
Rank: 8Rank: 8
来 自:dream
等 级:蝙蝠侠
威 望:2
帖 子:365
专家分:737
注 册:2013-5-5
收藏
得分:0 
回复 2楼 awisebird_
这位兄弟请教一下如何舍掉明显不能的?能不能具体说一下?
2013-08-23 10:30
abmdgg
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2013-8-23
收藏
得分:0 
谢2楼,但能用c语言编程来解决吗?
2013-08-23 10:46
awisebird_
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:82
专家分:185
注 册:2013-7-6
收藏
得分:0 
回复 3楼 赵疯子
假如是n个数相加,首先将总数除以n,得到一个平均数a,小于或者大于a的n个数相加都不会得到待求总数。
n=2时,显然最大的两个数都比a小,不用考虑
n=3和4时, 也不用考虑。
n=5时,a=55.8896,这个时候在a左右都有值,穷举分布于a左右(不在同一边)的5个数相加,判断
n=6...14,同理

只想到这里了
2013-08-23 11:15
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
我觉得这里能用到 B版 的动态内存分配吧。
用穷举这种方法也不是不可以,但复杂度太高了。。。

三十年河东,三十年河西,莫欺少年穷!
2013-08-23 12:01
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
有错误,我看看


[ 本帖最后由 rjsp 于 2013-8-23 12:31 编辑 ]
2013-08-23 12:30
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
程序代码:
// 输出为:57311 57131 56081 41059 35611 16132 12524 3599

#include <stdio.h>

int main()
{
    const unsigned a[14] = { 57311,57224,57131,57087,56608,56081,51919,50111,41059,35611,16132,12524,3599,1776 };
    const unsigned b = 279448;

    size_t c[14] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
    for( ; ; )
    {
        unsigned sum = 0;
        for( size_t i=0; i!=14 && c[i]<14; ++i )
            sum += a[c[i]];
        if( sum == b )
        {
            for( size_t i=0; i!=14 && c[i]<14; ++i )
                printf( " %u", a[c[i]] );
            printf( "\n" );
        }

        size_t idx;
        for( idx=14; idx!=0 && c[idx-1]>13; --idx );
        if( idx == 0 )
            break;
        ++c[--idx];
        for( size_t i=idx+1; i!=14; ++i )
            c[i] = c[idx] + (i-idx);
    }

    return 0;
}
2013-08-23 12:41
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:20 
刚才有事出去了会儿,换种简单的
程序代码:
#include <stdio.h>

int main()
{
    const unsigned a[14] = { 57311,57224,57131,57087,56608,56081,51919,50111,41059,35611,16132,12524,3599,1776 };
    const unsigned b = 279448;

    for( unsigned mask=1; mask!=1u<<14; ++mask )
    {
        unsigned sum = 0;
        for( size_t i=0; i!=14; ++i )
            if( mask & (1u<<i) )
                sum += a[i];
        if( sum == b )
        {
            for( size_t i=0; i!=14; ++i )
                if( mask & (1u<<i) )
                    printf( " %u.%03u", a[i]/1000, a[i]%1000 );
            printf( "\n" );
        }
    }

    return 0;
}
输出
 57.311 57.131 56.081 41.059 35.611 16.132 12.524 3.599
2013-08-23 13:56
abmdgg
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2013-8-23
收藏
得分:0 
万分感谢,帮了我一个大忙!
2013-08-23 17:01
快速回复:14个数,求其中几个数之和为一定数的方法。
数据加载中...
 
   



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

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