n个人排名,允许并列名次,共有多少种排名结果。(100分)解决方法
n个人排名,允许并列名次,共有多少种排名结果。(100分)
如题
------解决方案--------------------
如果没有并列,有n!种。
如果有1组2个人并列,有(n!/2!)*(n-1)!种
如果有2组2个人并列,有(n!/2!)*((n-1)!/2!)*(n-2)!种
如果有i组j个人并列,有.........
如果有i[m]组j[n]个人并列,有........
好复杂............
------解决方案--------------------
每个都有n个选择.共有n^n个
------解决方案--------------------
#include <iostream.h>
const int NUM = 3; //设定人数为3个人
int a[NUM]; //存储每个人的排名次序
/**
递归函数实现排名
**/
void fun(int n)
{
if(n == 0)
{
for(int k=0; k <NUM; k++)
{
cout < <a[k] < < ' ';
}
cout < <endl;
}
else
{
for(int i=1; i <= NUM; i++)
{
a[NUM-n] = i;
fun(n-1);
}
}
}
void main()
{
fun(NUM);
}
输出结果:
1 1 1
1 1 2
1 1 3
1 2 1
1 2 2
1 2 3
1 3 1
1 3 2
1 3 3
2 1 1
2 1 2
2 1 3
2 2 1
2 2 2
2 2 3
2 3 1
2 3 2
2 3 3
3 1 1
3 1 2
3 1 3
3 2 1
3 2 2
3 2 3
3 3 1
3 3 2
3 3 3
Press any key to continue
------解决方案--------------------
我想....
当没有并列时,有n!种
当用两个人并列时,原来的n个排名就变成n-1种排名,即有(n-1)!
如此类推...
到有n个人并列时,就只有1种
所以总共有:n!+(n-1)!+(n-2)!+......1
不知道对不对
------解决方案--------------------
太复杂了!
------解决方案--------------------
n的n次方吧!n人有n个选择!
------解决方案--------------------
关注一下,是挺复杂的
------解决方案--------------------
经典问题了,可以考虑递推:
假设n个人,排出了m个名次,有f(n,m)种结果(1 <=m <=n)
当m=1
f(n,m)=1
当n <m
f(n,m)=0
当1 <m <=n
假设n-1个人,排出了m个名次;新来1人,与前面某名次并列,有f(n-1,m)*m种结果
假设n-1个人,排出了m个名次;新来1人,与前面名次都不并列,有f(n-1,m-1)*m种结果
f(n,m)= f(n-1,m)*m + f(n-1,m-1)*m
综合上述,递推式:
0 n <m||m <1
f(n,m) = 1 1=m <=n
(f(n-1,m) + f(n-1,m-1))*m 1 <m <=n
n个人的排名就是f(n,1)+f(n,2)+f(n,3)+...+f(n,n)
------解决方案--------------------
1*n!+(n(n-1)/2)*(n-1)!+((n-1)(n-2)/2)*(n-2)!+...+(3*2/2)*2!+1
-------------------------
这个肯定是错的
------解决方案--------------------
终于看到正解了,不用递推思路还真是理不顺
学习ing......
------解决方案--------------------
呵呵 好贴收藏了!
------解决方案--------------------
mmmcd(超超) GG
------解决方案--------------------
mark!
------解决方案--------------------
mark
------解决方案--------------------
mark
------解决方案--------------------
我觉得mmmcd(超超)的算法对,并验证了一个1:1种,2:3种,3:13种,4:75种
并用这个算法写程序验证
function bar($n,$m)
{
if($m==1)return 1;
如题
------解决方案--------------------
如果没有并列,有n!种。
如果有1组2个人并列,有(n!/2!)*(n-1)!种
如果有2组2个人并列,有(n!/2!)*((n-1)!/2!)*(n-2)!种
如果有i组j个人并列,有.........
如果有i[m]组j[n]个人并列,有........
好复杂............
------解决方案--------------------
每个都有n个选择.共有n^n个
------解决方案--------------------
#include <iostream.h>
const int NUM = 3; //设定人数为3个人
int a[NUM]; //存储每个人的排名次序
/**
递归函数实现排名
**/
void fun(int n)
{
if(n == 0)
{
for(int k=0; k <NUM; k++)
{
cout < <a[k] < < ' ';
}
cout < <endl;
}
else
{
for(int i=1; i <= NUM; i++)
{
a[NUM-n] = i;
fun(n-1);
}
}
}
void main()
{
fun(NUM);
}
输出结果:
1 1 1
1 1 2
1 1 3
1 2 1
1 2 2
1 2 3
1 3 1
1 3 2
1 3 3
2 1 1
2 1 2
2 1 3
2 2 1
2 2 2
2 2 3
2 3 1
2 3 2
2 3 3
3 1 1
3 1 2
3 1 3
3 2 1
3 2 2
3 2 3
3 3 1
3 3 2
3 3 3
Press any key to continue
------解决方案--------------------
我想....
当没有并列时,有n!种
当用两个人并列时,原来的n个排名就变成n-1种排名,即有(n-1)!
如此类推...
到有n个人并列时,就只有1种
所以总共有:n!+(n-1)!+(n-2)!+......1
不知道对不对
------解决方案--------------------
太复杂了!
------解决方案--------------------
n的n次方吧!n人有n个选择!
------解决方案--------------------
关注一下,是挺复杂的
------解决方案--------------------
经典问题了,可以考虑递推:
假设n个人,排出了m个名次,有f(n,m)种结果(1 <=m <=n)
当m=1
f(n,m)=1
当n <m
f(n,m)=0
当1 <m <=n
假设n-1个人,排出了m个名次;新来1人,与前面某名次并列,有f(n-1,m)*m种结果
假设n-1个人,排出了m个名次;新来1人,与前面名次都不并列,有f(n-1,m-1)*m种结果
f(n,m)= f(n-1,m)*m + f(n-1,m-1)*m
综合上述,递推式:
0 n <m||m <1
f(n,m) = 1 1=m <=n
(f(n-1,m) + f(n-1,m-1))*m 1 <m <=n
n个人的排名就是f(n,1)+f(n,2)+f(n,3)+...+f(n,n)
------解决方案--------------------
1*n!+(n(n-1)/2)*(n-1)!+((n-1)(n-2)/2)*(n-2)!+...+(3*2/2)*2!+1
-------------------------
这个肯定是错的
------解决方案--------------------
终于看到正解了,不用递推思路还真是理不顺
学习ing......
------解决方案--------------------
呵呵 好贴收藏了!
------解决方案--------------------
mmmcd(超超) GG
------解决方案--------------------
mark!
------解决方案--------------------
mark
------解决方案--------------------
mark
------解决方案--------------------
我觉得mmmcd(超超)的算法对,并验证了一个1:1种,2:3种,3:13种,4:75种
并用这个算法写程序验证
function bar($n,$m)
{
if($m==1)return 1;