面试笔试题

  1 昨天参加一公司笔试,给几道算法题整懵了,其实也不难,但好久没有碰算法,只是有思路,要让我在这么短的时间内写出程序来还是不行。
  2 这里将其中一道稍微复杂一点的算法题写下来,以此小结。
  3
  4 题目描述:
  5 将N个鸡蛋放入到M个篮子中去(N>M),保证每个篮子中至少一个鸡蛋,然后指定一个数X, 要求从篮子中找出任意个篮子,这些篮子中鸡蛋的总和加起来要等于X。请找出所有这样的情况。
  6
  7 思路:
  8 由于N个鸡蛋放入M个篮子中有很多种放法,所以这里存在多种组合的情况。解决这个是第一步。
  9 对于已经放好的篮子,又有很多种情况可以等于X。这是第二步。
 10
 11 第一步:
 12 #define M   5         //basket number
 13 #define N   20        //eggs number
 14 #define X   8       //number to be specified
 15 int eggs[M];        //egg baskets
 16
 17 //check whether this satisfies the condition
 18 int check()
 19 {
 20     int i;
 21     int sum;
 22
 23     sum = 0;
 24     for (i =0; i < M; i++)
 25     {
 26         sum += eggs[i];
 27     }
 28     if (N == sum)
 29     {
 30         return 1;
 31     }
 32     return 0;
 33 }
 34
 35 int put_egg(int remain_eggs,int index)
 36 {
 37     int i;
 38     if (check() ==1)
 39     {
 40         for (i =0; i < M; i++)
 41         {
 42             cout << eggs[i] << " ";
 43         }
 44         cout << endl;
 45     }
 46     if (remain_eggs <=0 || index >= M)
 47     {
 48         return 0;
 49     }
 50
 51     for (i = N; i >=1; i--)
 52     {
 53         if (remain_eggs >= i)
 54         {
 55             eggs[index] += i;
 56             put_egg(remain_eggs-i, index+1);
 57             eggs[index] -= i;
 58             put_egg(remain_eggs, index+1);
 59         }
 60     }
 61     return 0;
 62 }
 63
 64 int my_put_egg()
 65 {
 66     int i;
 67     int remain = N - M;  //we put one egg into every basket.
 68     for (i =0; i < M; i++)
 69     {
 70         eggs[i] = 1;  //make sure every basket has one egg.
 71     }
 72     put_egg(remain, 0); //put the remain eggs into baskets.
 73     return 0;
 74 }
 75
 76 第二部分:
 77 找出和等于X的组合:
 78 int egg_stack[1024];
 79 int basket_stack[1024];
 80 int top =0;
 81 int solve_sum(int array[],int sum,int basket_num)
 82 {
 83     int tmp;
 84     if (sum <1 || basket_num <=0)
 85         return 0;
 86
 87     tmp = array[basket_num-1];
 88     if (sum > tmp)
 89     {
 90         egg_stack[top] = tmp;
 91         basket_stack[top] = basket_num;
 92         top++;
 93         solve_sum(array, sum-tmp, basket_num-1);
 94         top--;
 95         solve_sum(array, sum, basket_num-1);
 96     }
 97     else if (sum < tmp)
 98     {
 99         solve_sum(array, sum, basket_num-1);
100     }
101     else
102     {
103         int i;
104         cout <<"[" << basket_num <<"]:" << sum;
105         for (i =0; i < top; i++)
106         {
107             cout <<" [" << basket_stack[i] <<"]:" << egg_stack[i];
108         }
109         cout << endl;
110     }
111 }
112
113 int main()
114 {
115     my_put_egg();
116     return 0;
117 }
118
119

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值