基本算法(整数划分)
来源:互联网 发布:王思聪 知乎 编辑:程序博客网 时间:2024/06/11 09:03
所谓整数划分,是指把一个正整数n写成为
![](https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D151/sign=6e4ce877c0cec3fd8f3ea370e789d4b6/f636afc379310a556447cb4fb44543a98226102d.jpg)
其中,
为正整数,并且
;
为n的一个划分。
![](https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D17/sign=ec0599b398504fc2a65fb402e4dd25e8/e7cd7b899e510fb3cc0f622cda33c895d1430c72.jpg)
![](https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D73/sign=458e9999cbfcc3ceb0c0cb309345605a/03087bf40ad162d9f04d77a712dfa9ec8b13cded.jpg)
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D109/sign=71c4022f452309f7e36fa9124b0f0c39/c75c10385343fbf28c9fb198b37eca8064388fdd.jpg)
如果
中的最大值不超过m,即
,则称它属于n的一个m划分。
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D109/sign=71c4022f452309f7e36fa9124b0f0c39/c75c10385343fbf28c9fb198b37eca8064388fdd.jpg)
![](https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D174/sign=b87f1b99b01bb0518b24b72f027bda77/58ee3d6d55fbb2fb521e4fa94c4a20a44623dc57.jpg)
这里我们记n的m划分的个数为
。
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D52/sign=2c53b098b37eca80160539e59023c3fe/9e3df8dcd100baa1535351004410b912c8fc2e09.jpg)
例如,当n=4时,有5个划分,即
,
,
,
,
。
![](https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D20/sign=2ec319783987e9504617f46c1138cc7f/c8177f3e6709c93de80c184c9c3df8dcd000548a.jpg)
![](https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D34/sign=9c4387477fd98d1072d40a35203fd058/ac6eddc451da81cb8b4592765166d016082431ed.jpg)
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D34/sign=7928a8df97eef01f49141ec1e1fe3567/a50f4bfbfbedab64cee85c7bf436afc378311ef6.jpg)
![](https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D50/sign=bd469c12aa014c081d3b28a50b7b8c98/a2cc7cd98d1001e96d6305b4bb0e7bec54e79729.jpg)
![](https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D64/sign=603e75b6259759ee4e5063cfb3fb9702/a6efce1b9d16fdfac795d755b78f8c5495ee7b8b.jpg)
注意:
和
被认为是同一个划分。
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D60/sign=f20cf1e98635e5dd942ca6df77c62204/d50735fae6cd7b89239f2b380c2442a7d8330e9d.jpg)
![](https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D59/sign=8d226e70f8edab6470724dc9f63656ed/d8f9d72a6059252dfd070dbf379b033b5bb5b97c.jpg)
根据n和m的关系,考虑一下几种情况:
(一)当
时,无论m的值为多少
,只有一种划分,即
。
![](https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D35/sign=548def9c7c3e6709ba0043fa3ac76dca/29381f30e924b8995a0a6a836d061d950a7bf653.jpg)
![](https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D49/sign=a24177edd3160924d825a312d5074c7e/4e4a20a4462309f784eebda9710e0cf3d6cad683.jpg)
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D20/sign=f5f6dd928518367aa98978dd2f73bd63/902397dda144ad341c25973cd3a20cf430ad85f6.jpg)
(二)当
时,无论n的值为多少,只有一种划分,即n个1,
。
![](https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D39/sign=1585a0bee6dde711e3d245ffa6ef212a/9f510fb30f2442a719d4ed1ed243ad4bd01302b6.jpg)
![](https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D90/sign=4acf8ffc3a12b31bc36cc1298718a1f8/342ac65c10385343c2b0949a9013b07eca808809.jpg)
(三)当
时,根据划分中是否包含n,可以分为以下两种情况:
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D41/sign=9245b704a3ec08fa220012a658ee9a83/77c6a7efce1b9d1698bc89daf0deb48f8c546415.jpg)
(1)划分中包含n的情况,只有一个,即
。
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D20/sign=00113d5eae6eddc422e7b3fb38db731e/3c6d55fbb2fb431663c769c123a4462308f7d3b4.jpg)
(2)划分中不包含n的情况,这时划分中最大的数字也一定比n小,即n的所有
划分。
![](https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D44/sign=8df56d70f8edab6470724cc4f6365635/d62a6059252dd42a01ce1210003b5bb5c8eab841.jpg)
因此
。
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D164/sign=6915b76475c6a7efbd26ac20c9fbafe9/960a304e251f95ca5fcc800dca177f3e6709524b.jpg)
(四)当
时,由于划分中不可能出现负数,因此就相当于
。
![](https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D40/sign=56daee9c7c3e6709ba0044ff3ac76d96/060828381f30e92449c58e8a4f086e061d95f72c.jpg)
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D48/sign=7ccc12a1c55c1038207ecfcab311c95e/7e3e6709c93d70cfae5bb8b6fbdcd100bba12be3.jpg)
(五)当
时,根据划分中是否包含最大值m,可以分为以下两种情况:
![](https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D40/sign=e7958b242ddda3cc0fe4b92000e9d25f/d31b0ef41bd5ad6e7167765182cb39dbb7fd3cea.jpg)
(1)划分中包含m的情况,即
,其中
的和为n-m,因此这种情况下为
。
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D124/sign=26f7f9c8ae4bd11300cdb3306eaea488/267f9e2f07082838f152c1afbb99a9014c08f12a.jpg)
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D94/sign=90caa53ac81349547a1ee460574e0ad1/79f0f736afc37931c4409b92e8c4b74543a91164.jpg)
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D80/sign=3f1a85bf5a82b2b7a39f34c430addb94/738b4710b912c8fc5d90eb76ff039245d688212d.jpg)
(2)划分中不包含m的情况,则划分中所有值都比m小,即n的
划分,个数为
。
![](https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D48/sign=813b07a5ba389b503cffe15a84352628/aa18972bd40735fa512753029d510fb30e2408b1.jpg)
![](https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D76/sign=e6ee1f5a2c2eb938e86d78f4d46227cb/b7fd5266d01609241911bea0d70735fae6cd3450.jpg)
因此
。
![](https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D244/sign=35fff8d3cfbf6c81f3372bec883fb1d7/7c1ed21b0ef41bd50413f44f52da81cb38db3dcc.jpg)
综上所诉: ![](https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D128/sign=807bb2b6fbdcd100c99cfc234a8a47be/43a7d933c895d14316f7fc9870f082025baf0783.jpg)
![](https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D128/sign=807bb2b6fbdcd100c99cfc234a8a47be/43a7d933c895d14316f7fc9870f082025baf0783.jpg)
20 以内的一个数:
#include <stdio.h>
int main()
{
int s, i, j, k, t, u;
int s, i, j, k, t, u;
static int a[21][800][21];
printf("input s(s<=20):"); scanf_s("%d", &s);
a[2][1][1] = 1; a[2][1][2] = 1; a[2][2][1] = 2;
u = 2;
for (k = 3; k <= s; k++)
{
for (j = 1; j <= u; j++)
for (j = 1; j <= u; j++)
{
a[k][j][1] = 1;
a[k][j][1] = 1;
for (t = 2; t <= k; t++) // 实施在k−1所有划分式前加1操作
a[k][j][t] = a[k-1][j][t-1];
}
for (i = u, j = 1; j <= u; j++)
if (a[k-1][j][1]<a[k-1][j][2]) // 若k−1划分式第1项小于第2项
{
i++; // 第1项加1为k的第i个划分式的第1项
i++; // 第1项加1为k的第i个划分式的第1项
a[k][i][1] = a[k-1][j][1] + 1;
for (t = 2; t <= k-1; t++)
a[k][i][t] = a[k-1][j][t];
}
i++; a[k][i][1] = k; // k的最后一个划分式为:k=k
u = i;
}
for (j = 1; j <= u; j++) // 输出s的所有划分式
{
printf("%3d: %d=%d", j, s, a[s][j][1]);
printf("%3d: %d=%d", j, s, a[s][j][1]);
i = 2;
while (a[s][j][i]>0)
{
printf("+%d", a[s][j][i]); i++;
}
printf("+%d", a[s][j][i]); i++;
}
printf("\n");
}
return 0;
}
return 0;
}
阅读全文
0 0
- 基本算法(整数划分)
- 整数划分算法(代码)
- 算法实现(4)整数划分问题
- 算法设计:整数划分
- 算法设计:整数划分
- [算法]整数划分问题
- 递归算法---整数划分
- 递归算法-->整数划分
- 递归算法---整数划分
- 算法:整数划分
- 【分治算法】整数划分
- 整数划分问题(递归算法)
- 整数划分问题及其算法
- 算法笔记之 整数划分
- 【算法】 递归求解整数划分
- 整数划分问题 ----- 递归算法
- DP算法之整数划分
- 整数划分问题递归算法
- 浅谈Flask 中的 线程局部变量 request 原理
- 第三方框架Timber使用简单记录
- java深克隆与浅克隆
- 扑克牌八次洗牌等于没洗牌
- SpingBoot 定时任务删除N个月前的log 数据记录
- 基本算法(整数划分)
- warning:implicit declaration of function 'free'
- SSM项目从零开始到入门005-创建第一个mybatis项目
- HDOJ 2139 Calculate the formula (又是一题Java A不了)
- 机房之各种表
- iOS Action Extension
- MyBatis学习之入门篇
- c++学习:指针
- mongodb在windows上安装以及注意事项