Archive for the ‘数据结构’ Category

01背包问题-回溯法-C语言实现。

05月 14th, 2010

01背包问题-回溯法

#include <stdio .h>
#include <stdlib .h>
 
int n=5,c=10;
int value[5]={6,3,5,4,6};
int weight[5]={2,2,6,5,4};
int cv[5]={0,0,0,0,0};
int bv[5]={0,0,0,0,0};
int cw=0;
int curv = 0 ;
int bestv =0 ;
void output()
{
   int i =0;
   for(i; i<n ; i++)
     printf("%d ",bv[i]);
   printf("%d",bestv);     
}
 
void trackback(int i)
{
     int j;
    if(i>=n)
    {
         if(bestv<curv ) 
        {
            for(j=0;j<n;j++)
                bv[j] = cv[j]; 
            bestv = curv;
        } 
    }
    else
    {
         if(cw + weight[i]<=c)
         {
          cv[i] = 1; 
          cw +=weight[i];
          curv+= value[i];
          trackback(i+1);
          cw -=weight[i];
          curv-= value[i];
          }
          cv[i] =0;
          trackback(i+1);
 
    }
 
 
}
int main(int argc, char *argv[])
{
  trackback(0);
  output();
  system("PAUSE");	
  return 0;
}

求二进制数中1的个数

12月 19th, 2009

对于一个字节(8bit)的变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能地高。 Read more »

一摞烙饼引发的“血案”

12月 6th, 2009

看移山之道这个网站,看到了不错的问题,好多牛人在讨论,以后得常去,最近忙着考试,写到要少的多了。

有一次我烙了三个饼,一个两面都焦了,一个两面都是金黄色,一个一面是焦的,一面是金黄色,我把它们摞一起,只能看到最上一面,发现是焦的,问最上面这个饼的另一面是焦的概率是多少?

解法1:

1. 最上一面是焦的, 排除最上一张是两面金黄色

2. 剩下两张饼四个面, 三面是焦的, 一面金黄色, 现知道其中一面是焦的,

所以判断另一面是焦的概率就是求 二面焦 + 一面金黄 中焦的概率, = 2/2+1 = 2/3

解法2:

A=最上面的饼双面焦

B=最上面的饼双面金黄

C=最上面的饼一面金黄一面焦

J=最上面的一面焦

则P(J|A)=1,P(J|B)=0,P(J|C)=0.5

P(A|J)=P(AJ)/P(J)=(1/3)/(1/2)=2/3

字符串填充函数(javascript实现)

09月 22nd, 2009

昨天js课上讲到这样一个字符串填充函数,上课老师讲的不是多么仔细,没怎么听懂,下课后研究一下,问了一下以前教c的老师,发现这个小技巧还是很优秀的,可以很大程度的减少循环的次数,从而大大的减少运算的时间。 Read more »

C语言–栈要点总结,顺序栈的实现

03月 22nd, 2009

上周学习的数据结构中关于栈,有下面几点,我感觉引起我的重视。

  • 栈的基本操作中,基本上都是在栈顶进行的。比如在栈顶的插入,删除,栈的初始化,栈的判空(S.base == S.top),取栈顶元素等等。所以关于top指针要引起足够的重视和理解。
  • 理解栈和基本线性表的之间的关系。首先,栈就是线性表,栈是一种操作受限的线性表。可以想想就是带着镣铐跳舞的感觉,所以实现的时候必须严格按照栈的定义来执行栈的操作。
  • 栈不存在的条件:base = null;
  • 栈为空的条件:base = top;
  • 栈满的条件:top  – base = stacksize;

Read more »