整数划分
来源:互联网 发布:mac重新启动快捷键 编辑:程序博客网 时间:2024/05/17 23:16
整数划分
问题描述: 将正整数
上述描述是整数划分中最基本的描述, 整数划分是一类问题的总称. 正整数及其个数的不同约束可以得到不同的整数划分问题.
1. 最大值为 k 的正整数
该问题是最基本的约束条件, 对该约束分析如下:
设
根据上述结果, 得到如下 C++ 程序
int dp(int n, int k) { /* 求 n 的最大值为 k 的划分的个数 f(n, k) = f(n, k - 1) + f(n - k, k) 由上式可得: dp[n] += dp[n - k], (n >= k 且 dp[0] = 1) */ if (n <= 0 || k <= 0) return 0; int dp[128] = { 1 }; int realK = k <= n ? k : n; int iN, jK; for (jK = 1; jK <= realK; ++jK) for (iN = jK; iN <= n; ++iN) dp[iN] += dp[iN - jK]; return dp[n];}
2. 若干个奇正整数
该问题可以转化为问题 5 进行解决.
3. 若干个不同的正整数
该问题是最基本的约束条件, 对该约束分析如下:
设
根据上述结果, 得到如下 C++ 程序
int dpOfDifNum(int n, int k) { /* 求 n 的最大值为 k 的划分的个数 f(n, k) = f(n, k - 1) + f(n - k, k - 1) 由上式可得: dp[n] += dp[n - k], (n >= k 且 dp[0] = 1) */ if (n <= 0 || k <= 0) return 0; int dp[128] = { 1 }; int realK = k <= n ? k : n; int iN, jK; for (jK = 1; jK <= realK; ++jK) for (iN = n; iN >= jK; --iN) dp[iN] += dp[iN - jK]; return dp[n];}
4. 若干个给定的正整数
该问题根据最基本的问题推导:
设给定的
根据上述结果, 得到如下 C++ 程序
int dpMArr(vector<int>& mArr, int n){ /* mArr 给定的正整数 n 需要求的数 */ if (mArr.size() <= 0 || n <= 0) return 0; int dp[10240] = { 1 }; int m = mArr.size(), realM = m <= n ? m : n; int iN, jM; for (jM = 0; jM < realM; ++jM) for (iN = mArr[jM]; iN <= n; ++iN) dp[iN] += dp[iN - mArr[jM]]; return dp[n];}
5. m 个正整数之和
该问题是最基本的约束条件, 对该约束分析如下:
给问题等价于
设
根据上述分析, 得到如下 C++ 程序
int mSumOfNum(int n, int m){ return dp(n - m, m);}
阅读全文
0 0
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分:
- 整数划分
- 整数划分
- 整数划分
- Codeforce 101581 problem C 【gcd+预处理】
- java小程序——八皇后
- 集合之间的操作util-在全集allSet中标识出在子集sonSet 出现过的元素
- libmaxminddb
- [复习]进制转换 十进制转任意进制&任意进制转十进制
- 整数划分
- 51nod 1009 数字1的数量
- BZOJ 4326: NOIP2015 运输计划【LCA】【二分】【差分】
- #UVALive3523#Knights of the Round Table(点双连通分量 + 二分图染色判奇环)
- 17 商汤笔试2
- 0103-对齐输出
- Java:输出个人信息(类和对象)
- 【BzoJ 1601】【灌水】【最小生成树】【贪心决策】【并查集】
- Spark Java 分组排序取TopN