给定一个自然数N,要求把N拆分成若干个正整数相加的形式,参与加法运算的数可以重复。

注意:

  • 拆分方案不考虑顺序;
  • 至少拆分成2个数的和。

求拆分的方案数 mod 2147483648的结果。

输入格式

一个自然数N。

输出格式

输入一个整数,表示结果。

数据范围

1≤N≤4000

输入样例:

7

输出样例:

14

思路:将一个数差分成若干个数,很显然其中某些数可能会出现多次, 就是说这些数可以用无限多次来构成最初的数,这就是完全背包问题:有n个物品,每个物品可以选无限多次,求选出的若干个物品的价值之和恰好为n的方案个数。

状态表示:用f[i,j]表示选前i个物品且总价值之和恰好为j的方案,维护的属性:count。

状态计算:将f[i,j]按当前i(集合的最后一件物品)选和不选划分为两部分,前一部分:f[i-1,j];

后一部分:因为每件物品可能选多次,所以还要考虑次数,所这一部分方案数为:f[i,j-vi]+f[i,j-2vi]+...

因此,总的方案数为f[i,j]=f[i-1,j]+(f[i,j-vi]+f[i,j-2vi]+...),但是这样就要再枚举每件物品选的次数,时间复杂度变成o

(n^3),所以要再进一步优化:

通过对比观察f[i,j]和f[i,j-vi]代入上式的结果发现:f[i,j]=f[i-1,j]+f[i,j-vi]+f[i,j-2vi]+...

f[i,j-vi]=f[i-1,j-vi]+f[i,j-2vi]+...

所以,通过等价代换可得:f[i,j]=f[i-1,j]+f[i,j-vi]

所以每次当前状态i与i这一状态有关,所以只要在循环体积时,从小到大枚举,就可以保证每次状态都是新的,恰好达到统计效果。

完整代码:

#include <iostream>using namespace std;const int maxn=4e3+5,mod=2147483648;unsigned f[maxn];int main()
{int n;cin>>n;f[0]=1;for(int i=1;i<=n;i++){//枚举物品(最初的自然数)for(int j=i;j<=n;j++){//枚举体积(分解的每个数)f[j]+=f[j-i];}}cout<<(f[n]-1)%mod<<endl;//因为至少要拆成两个数,所以1个的不算,要-1return 0;
}

自然数拆分(完全背包问题求方案数)相关推荐

  1. 01背包,完全背包,多重背包,混合背包,二维费用背包,分组背包,背包问题求方案数

    1 01背包问题 有 NNN 件物品和一个容量是 VVV 的背包.每件物品只能使用 一次. 第 iii 件物品的体积是 viv_ivi​,价值是 wiw_iwi​.求解将哪些物品装入背包,可使这些物品 ...

  2. 经典背包问题3——背包问题求方案数 、背包问题求具体方案

    经典背包问题3--背包问题求方案数 .背包问题求具体方案 1. 背包问题求方案数 2. 背包问题求具体方案 1. 背包问题求方案数 有 N 件物品和一个容量是 V的背包.每件物品只能使用一次. 第 i ...

  3. [01背包] 背包问题求具体方案(01背包+求方案数+思维)

    文章目录 0. 前言 1. 01背包+求方案数+思维 0. 前言 相关: [背包] 背包问题算法模板(模板) 1. 01背包+求方案数+思维 12. 背包问题求具体方案 求方案数也是背包问题.dp 的 ...

  4. 动态规划之如何将问题抽象转化为0-1背包问题(详解利用动态规划求方案数)

    ⭐️前面的话⭐️ 本篇文章介绍如何对问题抽象转化成0-1背包问题求解和运用0-1背包求方案数.

  5. [完全背包] 货币系统(完全背包+求方案数)

    文章目录 0. 前言 1. 完全背包+求方案数+思维 0. 前言 相关: [背包] 背包问题算法模板(模板) 强相关: [完全背包] 买书(完全背包+裸题) [完全背包] 货币系统(完全背包+求方案数 ...

  6. 7-30 找单词——多重背包求方案数

    假设有x1个字母A, x2个字母B,- x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,- 字母Z的价值为26.那么,对于给定的字母,可以找到多少价值<=50的单词呢?单词的价值就是 ...

  7. [01背包] 数字组合(01背包+求方案数)

    文章目录 0. 前言 1. 01背包求方案数 0. 前言 相关: [背包] 背包问题算法模板(模板) 1. 01背包求方案数 278. 数字组合 将 M 看作背包容量,每个数看成一个物品,Ai 看成是 ...

  8. 观光(最短路求方案数2)

    题目描述 "您的个人假期"旅行社组织了一次比荷卢经济联盟的巴士之旅. 比荷卢经济联盟有很多公交线路. 每天公共汽车都会从一座城市开往另一座城市. 沿途汽车可能会在一些城市(零或更多 ...

  9. 噩梦的开始:动态规划之背包问题(01背包问题、完全背包问题、方案数填满型背包问题)

    目录 那年深夏 引入 动态规划是什么? 2.什么是背包问题? 3.背包问题的使用价值 01背包 题目 用纯暴力思想分析 动态规划思想来做 二维版 一维优化版 变式 读题 分析 代码实现 完全背包 题目 ...

最新文章

  1. 常见的网络***有哪些?
  2. 基于运维网V8环境安装ntop
  3. Spark Streaming 实现思路与模块概述
  4. 零元学Expression Blend 4 - Chapter 3 熟悉操作第一步(制作一个猴子脸)
  5. Angular6 依赖注入
  6. imageranger for Mac如何自定义过滤器选项
  7. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_2_Stream流中的常用方法_forEach...
  8. matlab中plot3,mesh,grid三者画图的区别
  9. 5G系统中BBU与RRU之间前传接口(CPRI)带宽计算
  10. 使用PyInstaller脚本打包时提示Unable to open icon file 的一种情况
  11. 数据库学习纪要(十二):SQL Sever介绍-4
  12. 焦距、光圈和景深的关系
  13. 《excel应用大全》(excel home 编著)--学习摘抄笔记2
  14. JPA Native Query(本地查询)及查询结果转换
  15. Qt Lmms 优秀的开源软件学习
  16. 【IoT】基于 CC2530 的 ZigBee 物联网系统设计
  17. HDU5142 NPY and arithmetic progression BestCoder Round #23 1002
  18. 苹果手机密码设置在哪里_手机SIM卡怎么设置密码
  19. 【C语言】assert() 断言的作用
  20. IPTV系统架构的分析与研究

热门文章

  1. Ubuntu 22.04 安装中文输入法
  2. 新零售--店铺选址问题
  3. 计算机视觉-全景图像拼接
  4. 【论文泛读148】ChineseBERT:通过字形和拼音信息增强的中文预训练
  5. Windows快速搜索小技巧
  6. 小长假出游攻略之新加坡圣淘沙
  7. 《五代史通俗演义》推荐——不良人粉丝的一点敬意.
  8. 解决Github 每次上传都要输入用户名和密码
  9. 2022 之Python操作 Excel,xlrd 与 xlwt 模块一文掌握
  10. 业内人士对20家N卡品牌的经典点评