声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1348|回复: 10

[综合讨论] 求和问题!

[复制链接]
发表于 2009-8-6 08:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
已知若干个自然数,例如:[12,34,56,3,4,15,67,90,34,23,78,44,87,32,5,67,33]

其中任意组合数值相加,如何找出总和最接近50的一个组合。
回复
分享到:

使用道具 举报

发表于 2009-8-6 14:28 | 显示全部楼层
一个思路,找出所有小于50的元素的集合,求其所可能组合的和。
发表于 2009-8-6 15:13 | 显示全部楼层
SumTarget=50;
X=[12,34,56,3,4,15,67,90,34,23,78,44,87,32,5,67,33]
CloseMost=+Inf;
for k1=1:length(X)
     for k2=k1+1:length(X)
          if(abs(X(k1)+X(k2)-SumTarget)<CloseMost)
               CloseIndex=[k1,k2];
          end
      end
end
% CloseIndex save what you want

[ 本帖最后由 VibrationMaster 于 2009-8-6 15:15 编辑 ]

评分

1

查看全部评分

发表于 2009-8-6 16:49 | 显示全部楼层
X=[12,34,56,3,4,15,67,90,34,23,78,44,87,32,5,67,33];
aa=nchoosek(X,2); [mm,ii]=min(abs(sum(aa,2)-50));
aa(ii,:)

[ 本帖最后由 ChaChing 于 2009-8-9 20:48 编辑 ]

评分

1

查看全部评分

发表于 2009-8-7 09:59 | 显示全部楼层
以上方法只考虑两个元素之和的情况,还有可能一个元素或3个之和、……更接近50,参考楼上的方法

评分

1

查看全部评分

发表于 2009-8-7 13:47 | 显示全部楼层
真的老了, 记性越来越差!
看完VibrationMaster的方式, 就是感觉不够通用性(若多个即需多个loop), 才试作的!
赶时间竟仅复制程序忘记说明! 还好friendchj够仔细, 谢谢!
 楼主| 发表于 2009-8-9 20:10 | 显示全部楼层

回复 板凳 VibrationMaster 的帖子

结果好像不对呀,最接近50的组合可能是2个或3个或更多数值
发表于 2009-8-9 20:57 | 显示全部楼层

到底是一个组合或所有组合?
刚刚才发现4F有个错误, 可能复制错了! sorry!
所有组合
X=[12,34,56,3,4,15,67,90,34,23,78,44,87,32,5,67,33];
aa=nchoosek(X,2); aad=abs(sum(aa,2)-50); mm=min(aad); ii=find(aad==mm); aa(ii,:)

评分

1

查看全部评分

发表于 2009-8-10 13:43 | 显示全部楼层
写了一个程序,可以参考一下[第一次寻找最小值时用了min,只取第一个min值,考虑到重复情况,可以用find代替min]:
clc
clear
x=[12,34,56,3,4,15,67,90,34,23,78,44,87,32,5,67,33];
% 寻找小于50的元素集合
x=sort(x);
for i=1:length(x)
    if x(i)>50
        break;
    end
end
x1=x(1:i-1);
% 寻找各种情况下的组合最小值
index=zeros(2,length(x1));
for i=1:length(x1)
    s=nchoosek(x1,i);
    [m,ind]=min((abs(sum(s,2)-50)));
    index(1,i)=ind;
    index(2,i)=m;
end
% 求各种情况下的组合最小值的最小值
ind=find((index(2,:)-min(index(2,:)))==0);
for i=1:length(ind)
    s=nchoosek(x1,ind(i));
    disp(s(index(1,ind(i)),:))
end
%%%%%%%%%%%%
     3    15    32
     3     4     5    15    23

[ 本帖最后由 friendchj 于 2009-8-10 18:36 编辑 ]

评分

1

查看全部评分

发表于 2009-8-10 19:16 | 显示全部楼层

回复 9楼 friendchj 的帖子

"总和最接近50"的元素一定要小於50吗?
发表于 2009-8-10 23:50 | 显示全部楼层

回复 10楼 ChaChing 的帖子

这个不一定,所以在第一步提取所有小于50的元素集合,严格来说是有问题的。针对这个问题取小于50不成问题,换成其他的情况应该考虑一下。元素越少,运算量也越小。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-26 11:41 , Processed in 0.068020 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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