如何实现更高效?

Ghost_tq 2009-06-01 07:40:38
有这样一个问题:int类型数组a{3,4,5,1,2,8},找到所有的“和”为10的元素的子集并将元素打印在屏幕上。请问那位有实现效率较高的算法。谢谢!
...全文
188 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghao111 2009-06-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hairetz 的回复:]
写了个很垃圾的遍历,复杂度为O(n^2).
想不到更合适的算法。


C/C++ code
void main()
{
int i,j,k,num,root,data[]={3,4,5,1,2,8},bit[20]={0},sum;
root=pow(2,sizeof(data)/sizeof(int))-1;
for(i=1;i<=root;i++)
{
memset(bit,0,20);
sum=0;
num=i;
j=0;
while(num>0)
{
bit[j++]=num%2;
num=num>>1;

[/Quote]
luojc714 2009-06-02
  • 打赏
  • 举报
回复
这属于算法问题吧,目前来说,我对算法只通了九窍,还一窍不通...
光宇广贞 2009-06-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 Erorr 的回复:]
拿空间换时间,如果数组里没有重复数字的话
1+2+3+4=10
1+2+7=10
1+3+6=10
1+4+5=10
2+8=10
2+3+5=10
3+7=10
4+6=10
只有以上几组
[/Quote]

万一是一个大数列的话……
光宇广贞 2009-06-02
  • 打赏
  • 举报
回复
遍历的复杂度太高了,是一个全组合的问题……
soft_jianbiao 2009-06-02
  • 打赏
  • 举报
回复
先把10分解 所有和为10的整数的可能情况!
其中中间出现的每种可能的情况与给出的数组元素比较(这些数组元素最好从小到大排序)

动态规划问题!
zjf30366 2009-06-02
  • 打赏
  • 举报
回复
先排序。
alan001 2009-06-02
  • 打赏
  • 举报
回复
排序
hiboys 2009-06-02
  • 打赏
  • 举报
回复
排序,
比如第一个数选了8,则其它可选数仅为2,1。比直接用全扫描好。
实现上可以用递归做。
帅得不敢出门 2009-06-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 liubuweiright 的回复:]
不懂,帮顶
动态规划不知道是不是可以用
[/Quote]
支持此法
MichaelBomb 2009-06-02
  • 打赏
  • 举报
回复
等待高手给出算法,学习之
Erorr 2009-06-01
  • 打赏
  • 举报
回复
拿空间换时间,如果数组里没有重复数字的话
1+2+3+4=10
1+2+7=10
1+3+6=10
1+4+5=10
2+8=10
2+3+5=10
3+7=10
4+6=10
只有以上几组
myjie0527 2009-06-01
  • 打赏
  • 举报
回复
遍历
ofcourseqi 2009-06-01
  • 打赏
  • 举报
回复
一种方法是直接遍历,算了下,这样的时间复杂度为 n! 。
另外还可以先排序,然后在搜索。这样的时间复杂度可能要小点。。。(在数组元素多的时候适用)
TADICAN 2009-06-01
  • 打赏
  • 举报
回复
感觉排序还是挺有用处,可以用来提前结束遍历。
  • 打赏
  • 举报
回复
写了个很垃圾的遍历,复杂度为O(n^2).
想不到更合适的算法。


void main()
{
int i,j,k,num,root,data[]={3,4,5,1,2,8},bit[20]={0},sum;
root=pow(2,sizeof(data)/sizeof(int))-1;
for(i=1;i<=root;i++)
{
memset(bit,0,20);
sum=0;
num=i;
j=0;
while(num>0)
{
bit[j++]=num%2;
num=num>>1;
}
for(k=0;k<j;k++)
{
if(bit[k]==1)
sum+=data[k];
}
if(sum==10)
{
for(k=0;k<j;k++)
if(bit[k]==1)
printf("%d ",data[k]);
printf("\n");
}
}
}

  • 打赏
  • 举报
回复
率较高的算法
排序?需效率貌似多余
额,想想只有遍历好些了
yeerxiang 2009-06-01
  • 打赏
  • 举报
回复
可以先分析物理关系,然后在写代码,比如说可以先排一下序,把它分成两部分,大于5的,和小于5的,大于五的只能和小于伍的数搭配……
liubuweiright 2009-06-01
  • 打赏
  • 举报
回复
不懂,帮顶
动态规划不知道是不是可以用
warren258 2009-06-01
  • 打赏
  • 举报
回复
遍历的时候如果情况已经不能满足条件,回朔。。。
yejinson 2009-06-01
  • 打赏
  • 举报
回复
好象遍历就是最好的方法了, 一味的提高效率反而进入误区的几率更大.
加载更多回复(3)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧