当前位置: 首页 > news >正文

分糖果算法题

分糖果,圣诞节到了,城堡里有k个小朋友,圣诞老人魔力袋里带了n件无差别的小礼物,请圣诞老人处理,将n个无差别的礼物分给k个小朋友的分法问题,给定n和k,输出总分法总数,并枚举所有的分法。其中 | 作为分隔符,每个小朋友的糖果用星号表示。

示例:3个糖果分给2个小朋友。总共有4种分法,枚举所有的分法如下:
*** |
** |*
* |**
| ***

java代码实现如下:

/*** 计算将n个无差别糖果分给k个小朋友的分法总数(组合数学中的"stars and bars"问题)* 公式:C(n + k - 1, k - 1)
*/
public static int countDistributionWays(int n, int k) {// 使用组合数公式 C(n + k - 1, k - 1)return combination(n + k - 1, k - 1);
}
/*** 计算组合数 C(n, k)*/
private static int combination(int n, int k) {if (k < 0 || k > n) return 0;if (k == 0 || k == n) return 1;// 使用递推公式 C(n, k) = C(n-1, k-1) + C(n-1, k)int[][] dp = new int[n + 1][k + 1];for (int i = 0; i <= n; i++) {for (int j = 0; j <= Math.min(i, k); j++) {if (j == 0 || j == i) {dp[i][j] = 1;} else {dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];}}}return dp[n][k];}
/*** 枚举所有分法*/
public static List<List<Integer>> enumerateDistributions(int n, int k) {List<List<Integer>> result = new ArrayList<>();List<Integer> current = new ArrayList<>();// 初始化当前分配方案for (int i = 0; i < k; i++) {current.add(0);}backtrack(n, k, 0, 0, current, result);return result;}
/*** 回溯法生成所有分配方案*/
private static void backtrack(int n, int k, int index, int sum,List<Integer> current, List<List<Integer>> result) {// 如果已经分配完所有糖果且分配到所有小朋友if (index == k) {if (sum == n) {result.add(new ArrayList<>(current));}return;}// 当前小朋友可以分得的糖果数(从0到剩余糖果数)int remaining = n - sum;for (int i = 0; i <= remaining; i++) {current.set(index, i);backtrack(n, k, index + 1, sum + i, current, result);}}
/*** 打印所有分配方案*/
public static void printDistributions(List<List<Integer>> distributions) {for (int i = 0; i < distributions.size(); i++) {List<Integer> dist = distributions.get(i);StringBuilder format = new StringBuilder();for (int j = 0; j < dist.size(); j++) {int candyCount = dist.get(j);// 添加星号format.append("*".repeat(candyCount));// 添加分隔符(除了最后一个小朋友)if (j < dist.size() - 1) {format.append("|");}}System.out.println(format.toString());}}
http://www.dtcms.com/a/587085.html

相关文章:

  • 世界最大的购物网站免费的个人简历模板在哪找
  • 商务网站要怎么做公司外贸网站怎么做
  • 网站收录下降深圳品牌型网站建设
  • Shell脚本基础:Bash 脚本编写与调试技巧
  • 兰州网站建设q479185700惠中国站长网入口
  • 成交型网站模板如何找网站做推广
  • 高端品牌网站建设有哪些上海网页制作设计营销
  • 站长之家最新域名查询上海注册公司哪家好
  • 小型项目外包网站wordpress做首页
  • 唐山建设造价信息网的网站盗版小说网站怎么做
  • pip install 命令默认使用阿里云镜像源
  • 石家庄网站建设加q.479185700如何注册企业
  • 想开个网站怎样开公司selz网页设计公司
  • 北京的网站制作公司苏州手工活外发加工网
  • 学校网站建设维护php网站支付宝接口
  • 软著去参加发明杯
  • 网站开发高级工程师专业在线旅游网站建设前的调研
  • 网站推广解释wordpress建站 知乎
  • V2X:从实验室到车轮上的“智慧对话”——技术起源与演进之路
  • 状态机dp
  • 网站php怎么做装修公司排名榜十大品牌
  • 网站建设公司自适应源码重庆妇科医院排行榜
  • 深度学习实战(基于pytroch)系列(六)softmax回归原理
  • 编辑网站精智wordpress主题
  • MR重建算法的原理与实现
  • 网站建设饱和了吗有哪些网站可以做任务返现
  • 国外科技网站欣赏网站设计 卡片式设计
  • ZArchiver1.0.10 | 提供强大的加密压缩功能,支持AES算法及文件名加密,界面简洁易于操作
  • p5541题解
  • 热门派对游戏:Grab The Mic商标版权维权,250+店涉案被TRO