题意:问你长度为n的二进制数,其中1的个数 <= k 的第 m 大的数是多少

解题思路:这种题目都可以用递归的思路来解决。从高位到低位开始枚举(枚举如果这一位是1,看最多有多少种情况。是否大于当前的m)

解题代码:

 1 // File Name: kimbits.c
 2 // Author: darkdream
 3 // Created Time: 2014年02月28日 星期五 19时02分25秒
 4 /*
 5 ID: dream.y1
 6 PROG: kimbits
 7 LANG: C++
 8 */
 9 #include<stdio.h>
10 #include<string.h>
11 #include<stdlib.h>
12 #include<time.h>
13 #include<math.h>
14 int hs[40];
15 int map[33][33];
16 void init()
17 {
18     memset(map,0,sizeof(map));
19     map[0][0] =1 ; 
20     for(int i = 1;i <= 31 ;i ++)
21     {
22       map[i][0] = 1; 
23       map[i][i] = 1; 
24     }
25     for(int i = 2;i <= 31;i ++)
26         for(int j = 1;j < i ;j ++)
27         {
28           map[i][j] = map[i-1][j] + map[i-1][j-1];
29         }
30 }
31 void solve(long long n , long long m , long long k )
32 {
33     long long sum[40];
34     memset(sum,0,sizeof(sum));
35     for(int i = 0;i <= n;i ++)
36     {
37        sum[i] = 0; 
38        for(int  j = 0;j <= m;j ++)
39        {
40          sum[i] += map[i][j];
41        }
42        if(sum[i] >= k )
43        {
44 
45            hs[i] = 1;
46            if(i == 1)
47                return ;
48            solve(i-1,m-1,k-sum[i-1]);
49            break;
50        }
51     }
52 }
53 int main(){
54    freopen("kimbits.in","r",stdin);
55    freopen("kimbits.out","w",stdout);
56     long long n , m , k ; 
57    scanf("%lld %lld %lld",&n ,&m,&k);
58    init();
59    solve(n,m,k);
60    for(int i = n ;i >= 1;i --)
61        if(hs[i])
62            printf("1");
63        else printf("0");
64    printf("\n");
65    return 0 ;
66 }
View Code

 

 

posted on 2014-03-04 19:11  dark_dream  阅读(317)  评论(0编辑  收藏  举报