A 不同盒子中 N 个相同球的组合
int f(int n,int a,int x)
{
if(a==1)
{
if(n>=0 && n<=x) //HERE WAS ERROR,sorry
return 1;
else
return 0;
}
int ans=0;
for(int i=0;i<=x;i++)
ans += f(n-i,a-1,x);
return ans;
}
你好!
示例:
这是算法,但花费了很多时间。 也许您知道解决这个问题的更快方法?非常感谢,也很抱歉让您担心。
int f(int n,int a,int x)
{
if(a==1)
{
if(n>=0 && n<=x) //HERE WAS ERROR,sorry
return 1;
else
return 0;
}
int ans=0;
for(int i=0;i<=x;i++)
ans += f(n-i,a-1,x);
return ans;
}
Hello!
Example:
Here is algorithm, but it spends very much time.
Maybe you know a faster way to solve this problem? Thanks very much and sorry for worry.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你需要的是动态规划。您需要记住函数 f 的那些已计算过的参数的值。也可以不使用递归来实现,如下所示:
这只是简单的技术演示。可以再优化一次,可以预先计算t-sum并消除l的循环。而且你不必存储整个表q,你只需要两层,这会减少内存使用。所以结果将如下所示:
所以最终需要 O(a*n) 时间来计算。
PS:请注意,答案可能是一个巨大的数字,可能会溢出任何本机整数类型。
What you need is dynamic programming. You need to memorize values of function f for those arguments for which it already have been calculated. Also it can be implemented without recursion like this:
This is only simple technique demonstration. It can be optimized one more time, you can precalculate t-sum and eliminate loop for l. And you don't have to store whole table q, you only need two layers, it will reduce memory usage. So the result will look like this:
So finally it will take O(a*n) time to compute.
PS: Note that answer can be a huge number which can overflow any native integer type.
首先,如果 A*X
A*X
A*X
A*X
A*X
A*X
N
,没有办法分配球,所以你可以早点停下来。如果A*X == N
,那么只有一种方法。那么首先选择放置X
球的盒子数量并以较小的限制重复出现可能会更快。如果您经常调用
f
,那么为二项式系数创建一个表可能会很有用。First of all, if
A*X < N
, there's no way to distribute the balls, so you can stop earlier. IfA*X == N
, there's only one way. Then it's probably faster to first pick the number of boxes in which you placeX
balls and recur with a smaller limit.It might be useful to create a table for the binomial coefficients if you call
f
often.看看 http://www.mathpages.com/home/kmath337.htm 和公式在页面底部。
look at http://www.mathpages.com/home/kmath337.htm and the formula at the bottom of the page.