一道实习生面试题
大概是今年的时候, 公司招聘实习生。我被安排阅卷。
当时被一道算法题难住了。 所有阅卷的人, 都觉得这道题很难做, 并且都没有看懂答案。
后来和出题的人沟通, 才懂了要领。 后来用动态规划写了一下这道题。
这道题, 大概的意思是:
有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();
}