标题:计算N个A与M个B可以组成多少种排列
只看楼主
雪夜祭奠
Rank: 2
等 级:论坛游民
帖 子:9
专家分:26
注 册:2011-4-23
得分:0 
#include "stdio.h"
int f(int m,int n)
{
if(m==0||n==0)return 1;
 return f(m-1,n)+f(m,n-1);/* f(m-1,n)是第一个空被A占据时的排列种数,f(m,n-1)是第一个空被B占据时的排列种数*/
}
main()
{
int x,y,c;
printf("Please input number of A and B:");
scanf("%d%d",&x,&y);
 c=f(x,y);
 printf("The array has %d methods.",c);
}
2011-04-30 19:38
虾B写
Rank: 8Rank: 8
来 自:湖北
等 级:蝙蝠侠
威 望:3
帖 子:395
专家分:922
注 册:2009-10-1
得分:0 
还是没看清题目,写成输出这些字串了

程序代码:
using System;
class a{

    static void Main(){
        int A=2;
        int B=3;

        int[] l=new int[A];
        for(int i=0;i<A;i++){
            l[i]=i;
            
        }
int u=0;
        while(l[0]<B+1){
            l[A-1]++;
            for(int i=A-1;i>0;i--){
                if(l[i]>i+B){
                    l[i-1]++;
                    
                    for(int y=i;y<A;y++){
                        l[y]=l[y-1]+1;
                    }
                }

            }
u++;

        }
            Console.WriteLine(u);
    }
}


[ 本帖最后由 虾B写 于 2011-4-30 21:38 编辑 ]

白娘故意下雨骗许仙的伞。祝英台十八里相送时装疯卖傻调戏梁山伯。七仙女挡住了董永的去路。牛郎趁织女洗澡时拿走了她的衣服。。。这些故事告诉我们;伟大爱情的开始,总归的有一个要先耍流氓!
2011-04-30 20:39
虾B写
Rank: 8Rank: 8
来 自:湖北
等 级:蝙蝠侠
威 望:3
帖 子:395
专家分:922
注 册:2009-10-1
得分:0 
没算法,直接翻转,重点在最后2个FOR,简单

白娘故意下雨骗许仙的伞。祝英台十八里相送时装疯卖傻调戏梁山伯。七仙女挡住了董永的去路。牛郎趁织女洗澡时拿走了她的衣服。。。这些故事告诉我们;伟大爱情的开始,总归的有一个要先耍流氓!
2011-04-30 20:44
为我留住记忆
Rank: 4
来 自:北京
等 级:业余侠客
帖 子:130
专家分:226
注 册:2011-4-30
得分:0 
前几天我做过这题  应该是 return f(m-1,n)+f(m,n-1)



学习c是为了自己更强大。。。
2011-04-30 22:19
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:0 
一样的答案。

(n+m-1)!/(n-1)!m! + (n+m-1)!/n!(m-1)! = (n+m-1)!/(n-1)!(m-1)! * (1/m + 1/n) = (n+m-1)!/(n-1)!(m-1)! * (m+n)/mn = (n+m)!/n!m!
也就是说 f(n-1, m) + f(n, m-1) = f(n, m)

不过这两种写法效率差距很大。不会看不出来吧。一个只要递归一边,另一个要递归两边。


[ 本帖最后由 pangding 于 2011-4-30 22:57 编辑 ]
2011-04-30 22:56
hjywyj
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:1114
专家分:2611
注 册:2010-4-14
得分:0 
以下是引用laoyang103在2011-4-29 19:40:45的发言:

我看过这个题 这是个递归  
它是国信蓝点杯测试题的第4个

我认为他的意思就是把n各B看成一个整体 所以我写的是

int f(int m, int n)
{
    if(m==0 || n==0) return 1;
    return ________f(m-1,n)+1_______________;
}
因为3元素有4各空  2各元素有三个空  所以f(m,n) = f(m-1,n)+1
不是这个吧?如果是这样,输入1,2.输出的是2.但是有好几种方法的。abb,bba,bab.应该是f(m-1,n)+f(m,n-1)吧?
2011-05-01 08:34
hjywyj
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:1114
专家分:2611
注 册:2010-4-14
得分:0 
int f(int m,int n)
{
if(m==0 || n==0) return 1;
return f(m-1,n)+f(m,n-1);}
main()
{int i,j;
scanf("%d%d",&i,&j);
printf("%d",f(i,j));
getch();
}
2011-05-01 08:35
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:0 
以下是引用虾B写在2011-4-30 20:39:11的发言:

还是没看清题目,写成输出这些字串了
 
using System;
class a{
 
    static void Main(){
        int A=2;
        int B=3;
 
        int[] l=new int[A];
        for(int i=0;i
这个算法是您自己想出来的? 还是借鉴的?
您能否讲解一下思路呢?

[ 本帖最后由 BlueGuy 于 2011-5-1 08:44 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2011-05-01 08:36
虾B写
Rank: 8Rank: 8
来 自:湖北
等 级:蝙蝠侠
威 望:3
帖 子:395
专家分:922
注 册:2009-10-1
得分:0 
AAABBB用数组表示A在字串的位子。012BBB

全长012345,就是把012变成345

第3位遇6进1
第2位遇5进1,
还是有算法的,N进制

白娘故意下雨骗许仙的伞。祝英台十八里相送时装疯卖傻调戏梁山伯。七仙女挡住了董永的去路。牛郎趁织女洗澡时拿走了她的衣服。。。这些故事告诉我们;伟大爱情的开始,总归的有一个要先耍流氓!
2011-05-01 20:49
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:0 
先前在维基上看到过你这样的算法,比那种递归要快很多...
我个人表示比较仰慕你,

[ 本帖最后由 BlueGuy 于 2011-5-1 21:22 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2011-05-01 21:20



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-338395-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.517418 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved