自然数拆分(完全背包问题求方案数)
给定一个自然数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;
}
自然数拆分(完全背包问题求方案数)相关推荐
- 01背包,完全背包,多重背包,混合背包,二维费用背包,分组背包,背包问题求方案数
1 01背包问题 有 NNN 件物品和一个容量是 VVV 的背包.每件物品只能使用 一次. 第 iii 件物品的体积是 viv_ivi,价值是 wiw_iwi.求解将哪些物品装入背包,可使这些物品 ...
- 经典背包问题3——背包问题求方案数 、背包问题求具体方案
经典背包问题3--背包问题求方案数 .背包问题求具体方案 1. 背包问题求方案数 2. 背包问题求具体方案 1. 背包问题求方案数 有 N 件物品和一个容量是 V的背包.每件物品只能使用一次. 第 i ...
- [01背包] 背包问题求具体方案(01背包+求方案数+思维)
文章目录 0. 前言 1. 01背包+求方案数+思维 0. 前言 相关: [背包] 背包问题算法模板(模板) 1. 01背包+求方案数+思维 12. 背包问题求具体方案 求方案数也是背包问题.dp 的 ...
- 动态规划之如何将问题抽象转化为0-1背包问题(详解利用动态规划求方案数)
⭐️前面的话⭐️ 本篇文章介绍如何对问题抽象转化成0-1背包问题求解和运用0-1背包求方案数.
- [完全背包] 货币系统(完全背包+求方案数)
文章目录 0. 前言 1. 完全背包+求方案数+思维 0. 前言 相关: [背包] 背包问题算法模板(模板) 强相关: [完全背包] 买书(完全背包+裸题) [完全背包] 货币系统(完全背包+求方案数 ...
- 7-30 找单词——多重背包求方案数
假设有x1个字母A, x2个字母B,- x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,- 字母Z的价值为26.那么,对于给定的字母,可以找到多少价值<=50的单词呢?单词的价值就是 ...
- [01背包] 数字组合(01背包+求方案数)
文章目录 0. 前言 1. 01背包求方案数 0. 前言 相关: [背包] 背包问题算法模板(模板) 1. 01背包求方案数 278. 数字组合 将 M 看作背包容量,每个数看成一个物品,Ai 看成是 ...
- 观光(最短路求方案数2)
题目描述 "您的个人假期"旅行社组织了一次比荷卢经济联盟的巴士之旅. 比荷卢经济联盟有很多公交线路. 每天公共汽车都会从一座城市开往另一座城市. 沿途汽车可能会在一些城市(零或更多 ...
- 噩梦的开始:动态规划之背包问题(01背包问题、完全背包问题、方案数填满型背包问题)
目录 那年深夏 引入 动态规划是什么? 2.什么是背包问题? 3.背包问题的使用价值 01背包 题目 用纯暴力思想分析 动态规划思想来做 二维版 一维优化版 变式 读题 分析 代码实现 完全背包 题目 ...
最新文章
- 常见的网络***有哪些?
- 基于运维网V8环境安装ntop
- Spark Streaming 实现思路与模块概述
- 零元学Expression Blend 4 - Chapter 3 熟悉操作第一步(制作一个猴子脸)
- Angular6 依赖注入
- imageranger for Mac如何自定义过滤器选项
- 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_2_Stream流中的常用方法_forEach...
- matlab中plot3,mesh,grid三者画图的区别
- 5G系统中BBU与RRU之间前传接口(CPRI)带宽计算
- 使用PyInstaller脚本打包时提示Unable to open icon file 的一种情况
- 数据库学习纪要(十二):SQL Sever介绍-4
- 焦距、光圈和景深的关系
- 《excel应用大全》(excel home 编著)--学习摘抄笔记2
- JPA Native Query(本地查询)及查询结果转换
- Qt Lmms 优秀的开源软件学习
- 【IoT】基于 CC2530 的 ZigBee 物联网系统设计
- HDU5142 NPY and arithmetic progression BestCoder Round #23 1002
- 苹果手机密码设置在哪里_手机SIM卡怎么设置密码
- 【C语言】assert() 断言的作用
- IPTV系统架构的分析与研究