回 帖 发 新 帖 刷新版面

主题:求助!!!大家帮帮忙,简单的动态规划题!

问题:有n个0,n个1,要求将部分放入一个i位的数列中(2n>=i),要求1的个数比0的多,问有几种排列方法?

例如:
n=2
i=3
则有
1 0 1 ; 1 1 0 ; 0 1 1 -- 3种排列方法;
所以 k=3

输入n,i,输入k(排列方法个数);

请问这题用动态规划怎么做啊?(老师说一定要用动态规划)
谢谢了

回复列表 (共4个回复)

沙发

首先把i拆成2个数x1, x2(x1 <= x2 <= n)表示数列中有x2个i,x1个0。对于每种拆法,再来一次组合,即i个中取x2个组合,接着组合中有的数的位置上的数就是1,其它位置上的数就是0,比如n = 3, i = 4
n   x1    x2
4 = 1  +  3
  = 2  +  2
共2种拆法。
(1)对于第1种拆法,有四种组合:[1 2 3], [1 2 4], [1 3 4] [2 3 4]
所以有四个数列:1110 1101 1011 0111
(2)对于第2种拆法,有六种组合:[1 2], [1 3], [1 4], [2 3], [2 4], [3 4]
所以有六个数列:1100 1010 1001 0110 0101 0011

一共有10个数列,输出10。

板凳

程序:
FUNCTION mult(s: INTEGER): LONGINT;
VAR
   l: INTEGER; ll: LONGINT;
BEGIN
    ll := 1;
    FOR l:=1 TO s DO ll := ll * l;
    mult := ll;
END;
FUNCTION c(a, b: INTEGER): LONGINT;
BEGIN
    c := mult(a) DIV (mult(b) * mult(a - b));
END;
VAR
   n, i, j, x1, x2: INTEGER; k: LONGINT;
BEGIN
    READLN(n, i);
    FOR j:=1 TO i DIV 2 DO BEGIN
        x1 := j; x2 := i - j;
        k := k + c(i, x2);
    END;
    WRITELN(k);
END.

3 楼

人家要动归.......
按你这样倒不如用排列组合算...

4 楼


楼上的两位一定是高手了!
不知现在你们还在吗?

我来回复

您尚未登录,请登录后再回复。点此登录或注册