一道实习生面试题

大概是今年的时候, 公司招聘实习生。我被安排阅卷。 

当时被一道算法题难住了。 所有阅卷的人, 都觉得这道题很难做, 并且都没有看懂答案。

后来和出题的人沟通, 才懂了要领。 后来用动态规划写了一下这道题。

 

这道题, 大概的意思是:

有m的鸡蛋, n个篮子, m>=n. 问有多少种方法, 是的每一种方法, 对认识的自然数k<=m, 都能从n个篮子中, 选出f个篮子, 是的f个篮子的鸡蛋总数=k

 

贴上代码:

define EGG  60 
#define BUCKET  10
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
void print(int (*m)[EGG+1][EGG+1])
{
    for(int i = 0; i < BUCKET; i++)
    {
        cout<<"\n\n*i=="<<i;
        for(int j = 0; j <= EGG; j++)
        {       
            cout<<endl;
            for(int w = 0; w <= EGG; w++)
                cout<<m[i][j][w]<<" ";
        }       
    }
}
void algo()
{
    int m[BUCKET][EGG+1][EGG+1];
    memset(m, 0, sizeof(int) * (BUCKET * (EGG + 1) * (EGG + 1)) );
    m[0][1][1] = 1;
    for(int i = 1; i < BUCKET; i++)
        for(int j = 1; j <= EGG; j++)
        {       
            for(int w = 1; w <= j; w++) 
            {       
                int lastsum = j - w;
                for(int z = 1; z <= lastsum ; z ++) 
                {       

                    if(w >= z && w <= lastsum+1) 

m[i][j][w] += m[i-1][j-w][z];
                }
            }
        }
    int sum = 0;
    for(int i = 1; i <= EGG ; i++)
        sum += m[BUCKET-1][EGG][i];
    cout<<"\nsum is :"<<sum<<endl;
}
int main()
{
    algo();

posted @ 2011-11-19 18:13  nosaferyao  阅读(156)  评论(0编辑  收藏  举报