algorithm - 计算具有 k 个部分的整数部分,每个部分低于某个阈值 m
问题描述
我想计算我们可以将数字划分为不同部分的方法的数量n
,k
其中每个部分不大于m
.
因为k := 2
我有以下算法:
public int calcIntegerPartition(int n, int k, int m) {
int cnt=0;
for(int i=1; i <= m;i++){
for(int j=i+1; j <= m; j++){
if(i+j == n){
cnt++;
break;
}
}
}
return cnt;
}
但是我如何计算整数分区k > 2
呢?通常我有n > 100000
, k := 40
, m < 10000
.
先感谢您。
解决方案
让我们从选择 k 个最大的合法数开始:m, m-1, m-2, ..., m-(k-1)。这加起来为 k*m - k(k-1)/2。如果 m < k,则没有解决方案,因为最小分区将 <= 0。假设 m >= k。
假设 p = (k m - k (k-1)/2) - n。
如果 p < 0,则没有解,因为我们可以得出的最大数小于 n。假设 p >= 0。请注意,如果 p = 0,则只有一个解,因此我们假设 p > 0。
现在,假设我们首先选择 k 个最大的不同合法整数,然后我们纠正它以获得解决方案。我们的更正涉及将值向左(在数轴上)移动 1 个插槽,进入空插槽,恰好 p 次。我们有多少种方法可以做到这一点?
开始的最小值是 m-(k-1),它可以向下移动 1,最多可以移动 mk 次。在此之后,每个连续值都可以向上移动到其前一个移动。
现在的问题是,有多少个最大值为 mk 和 p 的非增整数序列?这就是分区问题。即,我们可以将 p 分区多少种方式(最多分成 k 个分区)。这不是对此的封闭形式的解决方案。
有人已经在这里写了这个问题的一个很好的答案(需要稍微修改以满足您的限制):
推荐阅读
- bash - 为什么“echo -n”命令在 .sh 脚本中不起作用?
- html - 如何创建自定义OL列表?
- input - 为什么使用崇高文本在lua中询问用户输入时没有输出
- spring-boot - OpenAPI 规范 3.0 在浏览器和服务器下拉列表中显示不同的 url
- javascript - 如何根据反应传单中的选定位置飞行然后在位置周围获取边界
- google-cloud-platform - GCP 数据目录 - 一个用于所有项目(一个或多个组织)
- nginx - nginx 配置子域到子文件夹反向代理重定向
- c# - 有没有办法创建超时以尝试与 Xamarin.Forms 连接?
- android-studio - Android Studio:build.gradle(项目)在“项目”中不可见
- c# - 如何将用户返回到前一个问题