n个球放入m个箱子里

转载:https://blog.csdn.net/u012720552/article/details/80961684

1.球同,盒不同,无空箱

C(n-1,m-1), n>=m
0 n< m

2.球同,盒不同,允许空箱

C(n+m-1,m-1)

3.球不同,盒相同,无空箱

第二类斯特林数dp[n][m]
dp[n][m]=m*dp[n-1][m]+dp[n-1][m-1],1<=m < n
dp[k][k]=1,k>=0
dp[k][0]=0,k>=1
0,n < m

4.球不同,盒相同,允许空箱

sigma dp[n][i],0<=i<=m,dp[n][m]为情况3的第二类斯特林数

这种情况就是在第3种情况的前提下,去枚举使用的箱子的个数

5.球不同,盒不同,无空箱

dp[n][m]*fact[m],dp[n][m]为情况3的第二类斯特林数,fact[m]为m的阶乘

6.球不同,盒不同,允许空箱

power(m,n)

7.球同,盒同,允许空箱

dp[n][m]=dp[n][m-1]+dp[n-m][m], n>=m
dp[n][m]=dp[n][m-1], n < m
边界dp[k][1]=1,dp[1][k]=1,dp[0][k]=1

8.球同,盒同,无空箱

dp[n-m][m],dp同第7种情况,n>=m
0, n< m

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个问题属于二维装箱问题,可以使用一些启发式算法来解决,比如基于遗传算法或模拟退火算法的优化算法。 以下是一个基于贪心算法的简单实现,不一定能得到最优解,但可以作为参考: ```python class Model: def __init__(self, width, height): self.width = width self.height = height class Box: def __init__(self, width, height): self.width = width self.height = height self.x = 0 self.y = 0 class Packer: def __init__(self, width, height): self.width = width self.height = height self.used_width = 0 self.used_height = 0 self.boxes = [] def pack(self, models): models.sort(key=lambda m: max(m.width, m.height), reverse=True) for model in models: box = self.find_box(model.width, model.height) if box is None: continue box.model = model self.used_width = max(self.used_width, box.x + box.width) self.used_height = max(self.used_height, box.y + box.height) def find_box(self, width, height): for box in self.boxes: if box.x + width <= self.width and box.y + height <= self.height: ok = True for other in self.boxes: if other != box and intersect(box, width, height, other): ok = False break if ok: new_box = Box(width, height) new_box.x = box.x + box.width new_box.y = box.y self.boxes.append(new_box) return new_box if self.used_width + width <= self.width and self.used_height + height <= self.height: new_box = Box(width, height) new_box.x = self.used_width new_box.y = self.used_height self.boxes.append(new_box) return new_box return None def intersect(box, width, height, other): return (box.x + width > other.x and box.y + height > other.y and box.x < other.x + other.width and box.y < other.y + other.height) # example usage models = [Model(10, 20), Model(30, 20), Model(10, 30), Model(20, 10)] packer = Packer(100, 100) packer.pack(models) for box in packer.boxes: print(box.model.width, box.model.height, box.x, box.y) ``` 这个实现中,Box 表示一个已经的模型,Packer 表示装箱器。每个模型按照最大边长排序,然后依次箱子中。如果当前没有可用的箱子,则在右上角新建一个箱子。对于每个模型,从左到右、从上到下地扫描已有的箱子,找到第一个可以下该模型的箱子,并且该箱子与其它所有箱子不相交。如果找不到这样的箱子,则新建一个箱子。最后输出每个箱子中的模型位置和大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值