主题:求助!!!大家帮帮忙,简单的动态规划题!
泡泡糖
[专家分:230] 发布于 2007-09-11 21:25:00
问题:有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个回复)
沙发
Matodied [专家分:7560] 发布于 2007-09-11 21:39:00
首先把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。
板凳
Matodied [专家分:7560] 发布于 2007-09-11 21:51:00
程序:
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 楼
abcwuhang [专家分:1840] 发布于 2007-09-16 19:07:00
人家要动归.......
按你这样倒不如用排列组合算...
4 楼
jack-jiao [专家分:140] 发布于 2008-09-15 15:45:00
楼上的两位一定是高手了!
不知现在你们还在吗?
我来回复