面试题之苹果问题

系统 1753 0
问题描述:
1000个苹果放在10个箱子里, 10个箱子一模一样且要
求每个箱子都放有苹果, 问共有多少种放法?


参考:
呵呵,假设c(x,n)为x个apple放入n个箱子的所有放法(没有至少一个的限制)
有这样的递推公式
c(x,
1 ) = 1 ;
c(x,n)
= c(x,n - 1 ) + c(x - n,n - 1 ) + c(x - 2 * n,n - 1 ) + ...c(x - i * n,n - 1 ) + ... + c(x % n,n - 1 );

写成程序就是

#include
< iostream >

using namespace std;



typedef
int Type;

Typefun(
int apple, int box)
... {
Type
* p, * q, * tmp;
int i,j,k;
Typeresult;
// 本来我的fun(apple,box)是计算没有"至少放1个apple"限制的所有方法的
apple -= box; // 加上这句fun函数的功能就等价于每个box至少放一个apple了
p = new Type[apple + 1 ];
q
= new Type[apple + 1 ];
for (i = 0 ;i <= apple;i ++ )
p[i]
= 1 ; // p[i]此时表示i个apple放1个box时的可能种类(没限制)
for (j = 2 ;j <= box;j ++ ) // box数j从2递增到box
... {
for (i = 0 ;i <= apple;i ++ ) // 计算i个apple放j个box时的可能种类,结果存放到q[i]
for (q[i] = 0 ,k = i;k >= 0 ;k -= j)
q[i]
+= p[k];
tmp
= p; // 交换数组p,q
p = q;
q
= tmp;
}

result
= p[apple];
delete[]p;
delete[]q;
return result;
}


int main()
... {
int sum,m;
cout
<< " 请输入苹果数目: " ;
cin
>> sum;
cout
<< " 请输入箱子数: " ;
cin
>> m;
cout
<< " 放法总数目为: " << fun(sum,m) << endl;
system(
" pause " );
return 0 ;
}


上面的程序计算150个苹果只有毫秒级,因为运算都是加法所以算1000或者更大也很简单.
只要自己写一个长整数的类并且重载+和=以及<<运算符,然后替换我的typedef就可以了.

/////////////////////////////////////////////////////////////////////////////////////

面试题之苹果问题


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论