免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10032 | 回复: 18
打印 上一主题 下一主题

[算法] 算法设计中的台阶问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-21 11:23 |只看该作者 |倒序浏览
5可用积分
某人上台阶,他一步可迈一个台阶,两个台阶或三个台阶,共有n个台阶,编程输出他所有可能上法。
例如n=4时,则有(1 1 1 1)、(1 1 2)、(1 2 1)、(1 3)、(2 1 1)、(2 2)、(3 1)等7种不同的上法。
要求可以输入不同的n值,输出不同的结果。

论坛徽章:
0
2 [报告]
发表于 2007-08-21 12:25 |只看该作者
编译后运行 ./a.out 4即可


  1. #include <stdlib.h>
  2. #include <stdio.h>

  3. void func(int *status, int count, int deep)
  4. {
  5.   int i;
  6.   if (count<=0)
  7.   {
  8.     if (count == 0)
  9.     {
  10.       for (i=0;i<deep;i++)
  11.         printf("%d ", *(status+i));
  12.       printf("\n");
  13.     }
  14.   }
  15.   else
  16.   {
  17.     for (i=0;i<3;i++)
  18.     {
  19.       *(status+deep) = i+1;
  20.       func(status, count-(i+1), deep+1);
  21.     }
  22.    
  23.   }
  24.   
  25.   
  26. }


  27. int main(int argc, char *argv[])
  28. {
  29.   int i, *status;
  30.   if (argc<2)
  31. {
  32.     printf("too few arguments.\n");
  33.     return -1;
  34. }
  35.   i = atoi(argv[1]);
  36.   status = (int*)malloc(sizeof(int)*i);
  37.   func(status, i, 0);
  38.   free(status);
  39.   return 0;
  40. }

复制代码

原帖由 ITHJF 于 2007-8-21 11:23 发表
某人上台阶,他一步可迈一个台阶,两个台阶或三个台阶,共有n个台阶,编程输出他所有可能上法。
例如n=4时,则有(1 1 1 1)、(1 1 2)、(1 2 1)、(1 3)、(2 1 1)、(2 2)、(3 1)等7种不同的上法。
...

[ 本帖最后由 ypxing 于 2007-8-21 12:43 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-08-21 18:19 |只看该作者
谢谢

论坛徽章:
0
4 [报告]
发表于 2007-08-21 22:46 |只看该作者
当初一个复试的上机题

论坛徽章:
0
5 [报告]
发表于 2007-08-21 23:02 |只看该作者
考研复试?

BTW. LZ还没有给俺加分呢

原帖由 tyc611 于 2007-8-21 22:46 发表
当初一个复试的上机题

论坛徽章:
0
6 [报告]
发表于 2007-08-22 12:44 |只看该作者
动态规划问题吧。第N级楼梯可由第N-1级楼梯跨一步,N-2级楼梯跨2步,N-3级楼梯跨3步组成。
int countStep(int n)
{   
  int i;     
int step[1000];    //不超过1000级楼梯   
step[0] = 1;   
step[1] = 2;   
step[2] = 4;   
  for(i=3; i<n; j++)     {      
    step[ i ] = step[ i-1 ] + step[ i-2 ] + step[ i-3 ];   
  }   
return step[n-1];
}

[ 本帖最后由 daly88 于 2007-8-22 12:49 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-08-22 12:53 |只看该作者
这个可以用动态规划吗?
似乎不是求最优解呀,而是遍历所有解

贴一下你的完整代码吧

原帖由 daly88 于 2007-8-22 12:44 发表
动态规划问题吧。第N级楼梯可由第N-1级楼梯跨一步,N-2级楼梯跨2步,N-3级楼梯跨3步组成。
int countStep(int n)
{   
  int i;     
int step[1000];    //不超过1000级楼梯   
step[0] = 1;   
st ...

论坛徽章:
0
8 [报告]
发表于 2007-08-22 12:53 |只看该作者
不一样吧。人家要得是所有可能的组合。
N阶可能是由 N-3阶+1+1+1, 或者N-3 + 1 + 2
choc 该用户已被删除
9 [报告]
发表于 2007-08-22 17:42 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
10 [报告]
发表于 2007-08-24 11:17 |只看该作者

回复 #8 ivhb 的帖子

N-2 + 2, N-3+3 , N-1+1,由于N-1是通过N-2,N-3计算的,所以已包含了前面的结果了。
找个数验证一下就知道了。

求解用了动态规划的思想,但这题不是求最优解。如果加上判断大小,就可以知道最少步数了。
当然这题中只有1,2,3步,求最少步数用贪婪更好。但贪婪不总是能够通。
例如步数变为1, 4, 5三种,走8级,贪婪就不是最优了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP