求助一道算法题

kookhit 2007-01-24 11:18:11
题目:书架上有N本书,全部取下来,然后再全部放回去,要求每本书都不在原来的位置上,求有多少种摆放方法。

函数原形:int fun(int N);
例如:输入3返回2;

要考虑算法性能,
大家帮忙看看怎么做比较好
...全文
1008 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxspll 2007-05-07
  • 打赏
  • 举报
回复
mark
yaunx 2007-01-26
  • 打赏
  • 举报
回复
而且n!(1/2!-1/3!+1/4!-1/5!+...+(-1)^n/n!)也只是使用了容斥原理一步就得出的结论
yaunx 2007-01-26
  • 打赏
  • 举报
回复
我记得有个IOI金牌说过,数学题算法做,算法题数学做
中间件XL 2007-01-26
  • 打赏
  • 举报
回复
我觉得推到一定程度没必要再推,再推变成纯数学问题,失去了问题的域意义,失去了面向对象的重用思想。不过你当它数学题做就没问题,我相信ls的递推公式要推到:n!(1/2!-1/3!+1/4!-1/5!+...+(-1)^n/n!)
还有很长的路。
kookhit 2007-01-26
  • 打赏
  • 举报
回复
我自己又想了下,得到如下计算:

Sn=(N-1)(Sn-2 + (N-2)(N-3)....1)
=(N-1)!+(N-1)Sn-2

这个递推公式应该对了吧
(Sn-2中n-2是下标)
kookhit 2007-01-26
  • 打赏
  • 举报
回复
谢谢mathe()
果然是高手,这个方法不错,

还有没有其他方法呢?
VBDONET 2007-01-26
  • 打赏
  • 举报
回复
俺写了一个递推的公式,貌似要用递归来实现,很痛苦~~~
我算了前面8个,和楼上的结果一样,上班时间不能太嚣张~~不算下去了。
暂时也无法得到什么能精简算法的东西
只有一点是可以肯定的,结果肯定是n-1的倍数
wang430903 2007-01-26
  • 打赏
  • 举报
回复
0, 1, 2, 9, 44, 265, 1854, 14833, 133496, 1334961, 14684570, 176214841, 2290792932, 32071101049, 481066515734, 7697064251745, 130850092279664, 2355301661033953, 44750731559645106, 895014631192902121, 18795307255050944540...........
mathe 2007-01-26
  • 打赏
  • 举报
回复
n!/e的四舍五入
就是公式n!(1/2!-1/3!+1/4!-1/5!+...+(-1)^n/n!)的简化
这是因为
e^(-1)=1/2!-1/3!+1/4!-1/5!+...+(-1)^n/n!+....
所以
n!/e = n!(1/2!-1/3!+1/4!-1/5!+...+(-1)^n/n!+...)
去掉前面n-1项后,余下的为
n!*((-1)^(n+1)/(n+1)!+.....)
=(-1)^(n+1)*[1/(n+1)-1/(n+1)(n+2)+1/(n+1)(n+2)(n+3)-...)
这个数据绝对值小于1/(n+1)<=1/2
所以在n>=1时,我们就可以用
n!/e来替换,误差小于1/2
由于结果是整数,我们可以直接用n!/e四舍五入来替换了。

中间件XL 2007-01-26
  • 打赏
  • 举报
回复
可以写代码
F(1)=1
F(1)-->F(2)
...
dufusjw 2007-01-26
  • 打赏
  • 举报
回复
对szlhj()的分析稍加改动得到:
F(n)=n!-[C(n-1,n)F(n-1)+C(n-2,n)F(n-2)+...+C(n-i,n)F(n-i)+...+C(1,n)F(1)+1];
其中C(m,n)表示排列组合中从n个中取m个不排序的可能数;
怎么求出F(n)表达式?
wang430903 2007-01-26
  • 打赏
  • 举报
回复
f(n,m)=(n!)/((n-m+1)!)*f(n-m,0) 0=<m<=n -----------2式
--------------------------------------------------------------------
上面的式子有错误应该为:
f(n,m)=(n!)/((n-m+1)!)/m!*f(n-m,0)
wang430903 2007-01-26
  • 打赏
  • 举报
回复
不知道错在哪里
wang430903 2007-01-26
  • 打赏
  • 举报
回复
设n本书m本不动共有f(n,m)
则有 f(n,0)=n!-f(n,1)-f(n,2)……f(n,n) -----------1式
又有 f(n,m)=(n!)/((n-m+1)!)*f(n-m,0) 0=<m<=n -----------2式
再由 f(1,0)=0 f(1,1)=1 递推最终得到结果


最终结果真搞笑,我自己也不信 f(n,0)=n-1

下面是我的代码 很乱 -- :(
#include <stdio.h>
int f(int n,int m)
{
if(n<m||n<0||m<0)
printf("error!!!");
if(n==m)
return 1;
if(n==1&&m==0)
return 0;
if(n==1&&m==1)
return 1;
if(m==0)
{
int temp=1;
for(int i=1;i<n+1;i++)
{
temp*=i;
}
for(i=1;i<n+1;i++)
{
temp-=f(n,i);
}
return temp;
}
int temp=1;
for(int i=0;i<m;i++)
{
temp*=(n-i);
}
return (temp*f((n-m),0));
}

void main()
{
for(int i=1;i<10;i++)
for (int k=0;k<=i;k++)
printf("f(%d,%d)------>%d\n",i,k,f(i,k));
}

renzaijiang 2007-01-26
  • 打赏
  • 举报
回复
好象是n-1啊
1 2 3

2 3 1
3 1 2
2 种
1 2 3 4

2 1 4 3
3 4 2 1
4 3 1 2
3种

yaunx 2007-01-25
  • 打赏
  • 举报
回复
可以使用容斥原理证明,编辑公式太麻烦,我就偷懒不写了...
yaunx 2007-01-25
  • 打赏
  • 举报
回复
呃,想了下,给个计算式

n!(1/2!-1/3!+1/4!-1/5!+...+(-1)^n/n!)
kookhit 2007-01-25
  • 打赏
  • 举报
回复
ls的兄台看好了,是每本书都不在原来的位置上
yaunx 2007-01-25
  • 打赏
  • 举报
回复
貌似我题目理解错了...
yaunx 2007-01-25
  • 打赏
  • 举报
回复
n!-1
加载更多回复(24)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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