回溯法_求N个鸡蛋分到M个篮子里问题

N个鸡蛋分到M个篮子里(N>M),不能有空篮子,对于任意不大于于N的数,保证有几个篮子的鸡蛋数和等于此数,编程实现输入N,M两个数,输出所有鸡蛋的方法

 

全输出的话本质就是搜索+剪枝。

(n,m,min)表示当前状态,按照篮子里蛋的数目从小到大搜索。搜到了第m个篮子,1..m个篮子面共放了n个蛋,当前的篮子放了min个蛋。下一个扩展(n+t,m+1,t),for t=min...n+1。当n+(M-m)*min>N (鸡蛋不够时)或者2^(M-m)*n+2^(M-m)-1<N(鸡蛋太多)时 把这个枝剪掉……  ; 

太多时的情况如下: n,n+1,2n+2,4n+4,8n+8....

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
下面是一个用 Python 语言实现的回溯法解 N 皇后问题的代码: ```python def is_valid(board, row, col, n): """ 检查该位置是否可以置皇后 """ # 检查列 for i in range(row): if board[i][col] == 'Q': return False # 检查左上方对角线 i, j = row - 1, col - 1 while i >= 0 and j >= 0: if board[i][j] == 'Q': return False i, j = i - 1, j - 1 # 检查右上方对角线 i, j = row - 1, col + 1 while i >= 0 and j < n: if board[i][j] == 'Q': return False i, j = i - 1, j + 1 return True def backtrace(board, row, n, result): """ 回溯函数 """ if row == n: result.append([''.join(row) for row in board]) return for col in range(n): if is_valid(board, row, col, n): board[row][col] = 'Q' backtrace(board, row + 1, n, result) board[row][col] = '.' def solve_n_queens(n): """ 解 N 皇后问题 """ board = [['.' for _ in range(n)] for _ in range(n)] result = [] backtrace(board, 0, n, result) return result ``` 该算法的思路是通过递归函数 `backtrace` 进行回溯,依次尝试在每一行置皇后,并检查是否符合规则。如果在最后一行成功置了皇后,则得到了一组解。在实现中,我们用一个二维列表 `board` 来表示棋盘,其中每个位置的值为 '.' 表示该位置为空,'Q' 表示该位置置了皇后。函数 `is_valid` 用于检查该位置是否可以置皇后,函数 `backtrace` 用于递归进行回溯。在函数 `solve_n_queens` 中,我们创建了一个空的二维列表 `result`,将所有解存储到该列表中并返回。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值