設(shè)長度為j的01串,1的個數(shù)不大于k的個數(shù)為f[j,k]

方程:f[j,k]=f[j-1,k]+f[j-1,k-1]; //分別表示在當(dāng)前位加上0和加上1時的兩種狀況

邊界:f[j,0]=1,f[0,j]=1;f[j,k](k>j)=f[j,j]

這樣我們得到了所有的f[j,k](j,k\in Z, j,k>0),需要做的就是據(jù)此構(gòu)造出所求字符串.

設(shè)所求串為S,假設(shè)S的位中最高位的1在自右向左第K+1位,那么必然滿足F[K,L]< I,F[K+1,L] >=I,這樣的K是唯一的。所以S的第一個1在從右至左第K+1位.因?yàn)橛蠪[K,L]個串第K+1位上為0,所以所求的第I個數(shù)的后K位就應(yīng)該是滿足"位數(shù)為K且串中1不超過L-1個"這個條件的第I-F[K,L]個數(shù)。

于是我們得到這樣的算法:

S:='00....0'(n個0)
for K:=n-1 downto 0 do {題目保證有解,所以f[N,L]>I}
if F[K,L]<I then
begin
s[N-K]:=1;
dec(I,F[K,L]);{第K+1位是1,所以I減去第K+1位是0的串的個數(shù)}
dec(L);
end;
如果I>=F[k,l],說明第k+1位為1,又因?yàn)橛蠪[k,l]個數(shù)的第k+1位為‘0’,則這個數(shù)滿足第k+1位為1,且滿足“是第I-f[k,l]個后面k位里至多含有l(wèi)-1個1”
如果I<F[k,l],說明第k+1位為0,則這個數(shù)滿足第k+1位為0,則與F[k-1,l]比較。