zoukankan      html  css  js  c++  java
  • 隔板法

    计算不定方程的等式方程非负整数解的组数

    问题描述

    对于不定方程(a_1 + a_2 + a_3 + ... + a_k = g),求解该不定方程正整数解的组数
    eg: (k = 3, g = 4)时,(①1 + 1 + 2 = 4 ②1 + 2 + 1 = 4 ③2 + 1 + 1 = 4),所以此时是三组解

    问题分析

    问题可等效为求解将(g)个小球分成(k)组的方案数
    解决方法为隔板法。(g)个小球共(g-1)个间隔,(k-1)个隔板可以分为(k)个部分,在(g-1)个间隔中放置(k-1)个隔板的方案数即为答案
    隔板法能够运用的前提条件为保证(a_i)为非负整数,这样使用隔板划分出的数据才是合法的。假设(a_i)可能为负数或0,使用隔板是无法得到对应数据的

    代码实现

    仅需要实现组合数的计算,具体内容见组合数的代码实现

    例题

    方程的解

    计算不定方程的不等式方程非负整数解的组数

    问题描述

    (y_1 + y_2 + y_3 + ... + y_k leq g)
    (y_i geq 1)
    求符合条件的(y_i)的解的组数

    问题分析

    对于等式(y_1 + y_2 + y_3 + ... + y_k = g),求解方法可以采用隔板法,这是在上面讨论过的
    假设我们目前仅考虑(=)的情况,只需在(g-1)个间隔中放置(k-1)个隔板,从而构成k个数
    接着考虑(<)的情况,此时形成的k个数需要小于g,即g个球中有未进入分组的,在(g-1)个间隔中放置(k)个隔板,这样构成的(k+1)个分组中最后一组就相当于未进入分组的,前k个数的和就(<g)
    综合考虑以上两种情况,最终策略为在(g-1)个间隔加上最后的位置中放置(k)个隔板。当隔板全部处于中间(g-1)个位置时,对应的是(<)的情况;当最后一个隔板处于最后的位置时,中间(g-1)个间隔中还是(k-1)个隔板,对应的是(=)的情况。

    代码实现

    同样仅需要实现组合数的计算,,具体内容见组合数的代码实现

    例题

    序列统计

  • 相关阅读:
    字符编码笔记:ASCII,Unicode 和 UTF-8
    nginx 负载均衡设置
    ubuntu 修改时区
    js 高阶函数 filter
    js 高阶函数 map reduce
    省市联级菜单--js+html
    php代码优化技巧
    json、xml ---- 数据格式生成类
    初识设计模式(1)---单例、工厂、注册树
    php 链式操作的实现 学习记录
  • 原文地址:https://www.cnblogs.com/G-H-Y/p/14559727.html
Copyright © 2011-2022 走看看