sixth

原创 2006年06月05日 22:09:00



二、任给 1<=n<=20 个不同的非零正整数,每个正整数最多使用1次,请问这n个正整数能够加和的结果共有多少种(不考虑和超出long的最大值的可以),
程序中请实现如下函数。用于计算数组data,中ncount的加和的数量。
long getsumcount(long data[], long count);
程序中可以出现别的辅助函数。或辅助结构等。

例如,
data[] = {1,2,3,4};
ncount = 4;
函数返回 10

分解如下。(0不算)

1  = 1
2  = 2
3  = 3 = 1+2
4  = 4 = 1+3

5  = 2+3 = 1+4
6  = 2+4 = 1+2+3
7  = 3+4 = 1+2+4
8  = 1+3+4
9  = 2+3+4
10 = 1+2+3+4
如上。所以结果是10种可能

--

第二题弄出来了,采用hash,在我4楼所说极端情况下,仍然是1.3G的CPU,使用时间1秒多。不过代码就长了点。

#define hashsize (1<<16)
#define hashmask (0xffff)
typedef struct node{
    long data;
    struct node *next;
}NODE;
NODE hashtab[hashsize];

/*寻找并插入,找到而未插入返回0,未找到而插入返回1*/
static int hashinsert(long sum)
{
    NODE *p,*q;
    p = hashtab+ (sum & hashmask);
    while( p && (p->data!=sum) )
    {   q = p;
        p = p->next;
    }
    if( p )
        return 0;
    q->next = p = malloc(sizeof(NODE));
    p ->next = NULL;
    p ->data = sum;
    return 1;
}
/*删除hash表的第index条目*/
static void hashdelete(long index)
{   NODE *p,*q;
    p = hashtab[index].next;
    while(p)
    {   q = p;
        p = p->next;
        free(q);
    }
}
/*这才是正主^^*/
long getsumcount(long data[],long count)
{
    long i;
    int state[20] = {0};
    long sum = 0,sp = 0;
    int ret = 1; /*由于0已经先放入表中,所以首先就有一个*/
    
    /*hash表初始化*/
    for(i=0;i<hashsize;++i)
    {   hashtab[i].data = 0;
        hashtab[i].next = NULL;
    }
    /*回溯求解*/
    while(sp>=0)
    {   if(sp==count)
        {   ret += hashinsert(sum);
            --sp;
        }
        switch( state[sp] )
        {   case 0:
                state[sp] = 1;
                sum += data[sp];
                ++sp;
                break;
            case 1:
                state[sp] = 2;
                sum -= data[sp];
                ++sp;
                break;
            case 2:
                state[sp] = 0;
                --sp;
                break;
        }
    }
    /*hash表销毁*/
    for(i=0;i<hashsize;++i)
    {   hashdelete(i);
    }
    return ret;
}

--

 

相关文章推荐

sixth sense之iphone开发环境搭建

为了搭建这整个开发环境,专门购买了一台台式机,花了2000左右。 这台式机没有光驱,所以只能用U盘来安装windows XP操作系统。 其安装步骤参考http://www.upanok.c...

《黑马程序员》The sixth day

---------------------- android培训、java培训、期待与您交流! ---------------------- ---------------------- an...

#Objective - C - sixth-Day 数组排序及集合遍历

总结 遍历:对集合中元素依次取出的过程叫做遍历。 原理:通过for循环的循环变量⽤作数组元素下标来获取不同下标的元素。 循环次数就是数组元素的个数。 数组是有序容器,因此集合中只有数组才能排序。 实际...

C++ primer plus(sixth edition) 编程练习答案(answers for programing exercises)第九章(chapter 9) 1-4

重拾c++,不知道自己为什么莫名奇妙好久没学,好吧,现在只能抓紧时间慢慢拾起来了,希望这学期之后具有初步的编程能力。现在已经都忘了,时间也不容许自己再浪费了,马上就要毕业了。。。好怕以后。9.1//g...

C++ primer plus(sixth edition) 编程练习答案(answers for programing exercises)第八章(chapter 8) 1-4

8.1 #include void silly(const char * s, int n = 0); int main(void) { using namespace std; ...

iOS-Best Practices for Interacting with a Remote Peripheral Device(API Reference) the sixth part

Best Practices for Interacting with a Remote Peripheral DeviceCore Bluetooth framework使许多central端交易简...

推荐尽可能看Paul Deitel的英文原著《C how to Program, Sixth Edition》

有时候真的有些不忍心,我感觉这是对原著和原著作者严重的亵渎和不尊重:          翻译者,并没有将原著的本意/核心思想翻译出来,某种程度上是一种单纯的英译汉,我觉得这是一个英语翻译家干的事情(...

湖南省第六届大学生计算机程序设计竞赛 The Sixth Hunan Collegiate Programming Contest 主办:湖南省教育厅 协办:湖南省高

湖南省第六届大学生计算机程序设计竞赛The Sixth HunanCollegiate Programming Contest               主办:湖南省教育厅协办:湖南省高等教育学会计...

sixth sense之用手势控制鼠标

如果能用手势来模拟鼠标的动作,就可以用手势进行很多的操作,比如打开文件、关闭文件、播放视频、关闭电脑等等。所以要和sixth sense系统进行友好的人机交互,模拟鼠标的动作是第一步。 如下的代...

database system concept sixth edition solution

  • 2017年11月09日 09:42
  • 12.46MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sixth
举报原因:
原因补充:

(最多只允许输入30个字)