明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 801|回复: 3

lisp编程怎么解决分糖问题

[复制链接]
发表于 2016-10-19 12:52 | 显示全部楼层 |阅读模式
1明经币
lisp编程怎么解决分糖问题?
将n(n<60)颗糖分给k(1 £ k < 20)个人,每人分到的数量至少1颗、至多m (1 £ m < 10)颗,一共有多少种分法?并列出所有分法。
例如:当n = 3,k = 2,m = 2时,只有1种分法:(1,2).其中(1,2)和(2,1)被认为是同一种分法.
再如:当n = 6,k = 3,m = 3时,有2种分法:(1,2,3),(2,2,2).

对于n=10,k=4,m=4的结果实际上只有5种方案:

1:1 1 4 4

2:1 2 3 4

3:1 3 3 3

4:2 2 2 4

5:2 2 3 3


发表于 2016-10-24 09:46 | 显示全部楼层
这个问题很复杂,涉及到动态规划算法,lisp解决不了的。很遗憾啊! lisp不是万能的。
回复

使用道具 举报

发表于 2016-10-25 19:11 | 显示全部楼层
  1. ;;;把n颗糖分给k个人,最多m颗
  2. (defun AYL-a (n k m / Lst0 I)
  3.   (if (and (> n k) (> k 1))
  4.     (progn
  5.       (setq Lst0 nil I 1)
  6.       (setq m (min n m))
  7.       (repeat m
  8.         (setq Lst0 (cons I Lst0))
  9.         (setq I (1+ I))
  10.       )
  11.       (vl-remove-if (function (lambda (x) (/= (apply '+ x) n))) (combination Lst0 k))
  12.     )
  13.   )
  14. )
  15. (defun combination (lst m)
  16.   (cond        ((zerop m) '(()))
  17.         ((null lst) '())
  18.         (T
  19.          (append (mapcar '(lambda (y) (cons (car lst) y))
  20.                          (combination lst (1- m))
  21.                  )
  22.                  (combination (cdr lst) m)
  23.          )
  24.         )
  25.   )
  26. )

评分

参与人数 1明经币 +1 收起 理由
vladimirputin + 1 很给力!大神,帮忙改成能运行的命令,输入n.

查看全部评分

回复

使用道具 举报

发表于 2017-8-12 20:32 来自手机 | 显示全部楼层
算法跟语言无关,具体的code跟语言有关。效率主要跟算法有关
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-3-29 09:50 , Processed in 0.159211 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表