zoukankan      html  css  js  c++  java
  • 完全背包的计数问题

    引例

    题目描述:输入一个n,输出n的所有组成方案,例如:

    n=4,有

    4 = 4;
    4 = 3 + 1;
    4 = 2 + 2;
    4 = 2 + 1 + 1;
    4 = 1 + 1 + 1 + 1;

    5种方案。

    接下来升级一下

    正题

    如题 洛谷P2563——质数和分解

    此题就需要将完全背包变形一下

    原本完全背包的转移方程为
    (f(j) = max( f(j), f(j-v[i])+w[i] ))

    若是求计数问题 则变为
    (f(j) = f(j)+f( j-v[i] ))

    即变为
    (f(j) += f( j-v[i] ))

    (f(j)) 表示能拼成j的方案数

    (f( j ) += f( j-v[i] )) 的意思是j可以由 j-v[i] 加上一个 v[i] 拼凑成
    In other words: j可以由某个数加上一个素数组成),而f(j-v[i])又可由某个数加上一个素数组成,而在此过程中,也就是方案的累加。

    注意初始化 f(0) = 1

    此转移方程可以和朴素背包一样表示为二维状态:如下:

    (f(i, j))表示前i个素数里面能拼成j的方案数

    注意初始化f[0][0] = 1

    作者:Jude_Zhang
    关于博主:评论和私信会在第一时间回复。或者直接私信我。
    版权声明:本博客所有文章除特别声明外,均采用BY-NC-SA 许可协议。转载请注明出处!
    支持博主:如果您觉得文章对您有帮助,可以点击文章下方赞一下。您的鼓励是博主的最大动力!
  • 相关阅读:
    java并发初探CountDownLatch
    java并发LockSupport
    java并发初探ReentrantWriteReadLock
    mysql视图初探
    mysql索引
    java并发AtomicIntegerFieldUpdater
    php7.* 新特性
    搜索引擎 对比
    2021-03-09 吐槽
    linux 进程&线程
  • 原文地址:https://www.cnblogs.com/judezhang/p/14610874.html
Copyright © 2011-2022 走看看