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;
}

--

 

A Simple Math Problem

Description In sixth grade, students are presented with different ways to calculate the Least Com...
  • u011292087
  • u011292087
  • 2014年01月15日 13:19
  • 848

1623. Sixth Grade Math

1623. Sixth Grade Math Description In sixth grade, students are presented with different w...
  • luojiayu14
  • luojiayu14
  • 2011年12月14日 00:30
  • 737

南邮 OJ 1531 A ? Sixth Grade Math

A ? Sixth Grade Math 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte 总提交 : 27    ...
  • changshu1
  • changshu1
  • 2015年08月06日 09:01
  • 143

The sixth sense

Director: M. Night SyamalanActors: Bruce Willis--Dr. Malcolm Crowe            Haley Joel Osment---Co...
  • nomatterhow2000
  • nomatterhow2000
  • 2009年10月25日 05:59
  • 184

sixth(二叉排序树)!

二叉排序树就是中序遍历之后是有序的; 构造二叉排序树步骤如下; 插入法构造  第二个结点 4 比 6 来的小 所以插入在 6 的左子树;  第三个结点 8 比 ...
  • BePosit
  • BePosit
  • 2018年01月24日 10:49
  • 25

Swift(iOS_Apprentice)学习笔记

1、xcode创建swift项目: File->new->Project....->iOS->Application->Single View Application:
  • windvally
  • windvally
  • 2015年11月20日 09:51
  • 616

Sixth records of career

November 28,2016 Start learning java today.the point of knowledge is the konwledge that i have lear...
  • weixin_36792310
  • weixin_36792310
  • 2016年11月28日 23:03
  • 42

sixth(求y)

/*   *copyright(c) 2014,烟台大学计算机学院   *All rights reserved。   *文件名称:sixth(求y)   *作者:王忠   *完成日期:20...
  • wangzhongwangmin
  • wangzhongwangmin
  • 2014年10月15日 22:18
  • 397

The sixth pattern------------Command Pattern

OO模型:命令模式:将请求封装成对象,这样可以让你使用不同的请求、队列,或者日志请求来参数化其他对象。命令模式也可以支持撤销操作。我的理解:(感觉自己也不是特别理解)命令模式可以将动作的请求者从动作的...
  • haoyuewuwei
  • haoyuewuwei
  • 2009年08月22日 22:07
  • 346

sixth(求y)

/*   /* [cpp] view plaincopyprint? *copyright(c) 2014,烟台大学计算机学院   *copyright(c) 2014...
  • wangzhongwangmin
  • wangzhongwangmin
  • 2014年10月15日 20:59
  • 271
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sixth
举报原因:
原因补充:

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