一家著名外包公司的笔试题。

dong364 2008-01-14 04:11:12
设int a[n],a中存有n个整数,又设一整数m,求a[n]的子集,使得每一子集各项的和等于m。(例如:int a[3]={1,2,3,4,},m=5,则子集为:{2,3},{1,4})。请给出解题思路,并考虑效率问题。
...全文
332 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
L_Spring 2008-01-16
  • 打赏
  • 举报
回复
頂 7 樓
dong364 2008-01-16
  • 打赏
  • 举报
回复
to icemine:你写的程序是没错,但是效率好像不怎样。
allanqyz 2008-01-16
  • 打赏
  • 举报
回复
相对著名吗,不知道是东软还是华信。
独孤过儿 2008-01-14
  • 打赏
  • 举报
回复
我靠,外包公司还有著名的???服了!
冰矿 2008-01-14
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#define N 4
int mask[N];
void subsum (int *set, const int size, int c, int m)
{
int sum = 0;
int i = 0;
if(c == size)
{
for(i = 0; i < size; i++)
if(mask[i] == 1)
sum = sum + set[i];
if(sum == m)
{
printf(" { ");
for(i = 0; i < size; i++)
if(mask[i] == 1)
printf("%d ",set[i]);
printf("}\n");
}
}
else
{
mask[c] = 1;
subsum(set, size, c + 1, m);
mask[c] = 0;
subsum(set, size, c + 1, m);
}
}

int main ()
{
int set[N] = {3,2,5,6};
subsum(set,N,0,11);
system("PAUSE");
return 0;
}

运行无误,楼主能否多给些分,嘿嘿!!!
melody1128 2008-01-14
  • 打赏
  • 举报
回复
mark~..
dong364 2008-01-14
  • 打赏
  • 举报
回复
例子中a[3]改为a[4]
dong364 2008-01-14
  • 打赏
  • 举报
回复
说明:子集的项个数可以从1个到n个,我举的例子是最简单的,但不是说就两个项组成的,还有各位仁兄,循环嵌套太多了可是会极大地降低效率的。
huangxw000 2008-01-14
  • 打赏
  • 举报
回复
楼猪太强了,int a[3]={1,2,3,4}.
长安宁 2008-01-14
  • 打赏
  • 举报
回复
先对那个数组排序;
然后,向后面查找组合,当接近,其中一项,加上第一项大于m的时候,break;
可以减少运算量

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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