ImageVerifierCode 换一换
格式:DOC , 页数:9 ,大小:94KB ,
资源ID:8973225      下载积分:10 金币
验证码下载
登录下载
邮箱/手机:
图形码:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/8973225.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请


权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4009-655-100;投诉/维权电话:18658249818。

注意事项

本文(整数划分问题.doc)为本站上传会员【s4****5z】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

整数划分问题.doc

1、整数划分是把一个正整数 N 拆分成一组数相加并且等于 N 的问题. 比如: 6 5 + 1 (序列) 4 + 2, 4 + 1 + 1 3 + 3, 3 + 2 + 1, 3 + 1 + 1 + 1 2 + 2 + 2, 2 + 2 + 1 + 1, 2 + 1 + 1 + 1 + 1 1 + 1 + 1 + 1 + 1 + 1 假设F(N,M) 整数 N 的划分个数,其中 M 表示将 N 拆分后的序列中最大数 考虑边界状态: M = 1 或者 N = 1 只有一个划分 既: F(1,1) = 1 M = N : 等于把M - 1 的划分数加 1 既: F(N,N) =

2、F(N,N-1) + 1 M > N: 按理说,N 划分后的序列中最大数是不会超过 N 的,所以 F(N,M ) = F(N,N) M < N: 这个是最常见的, 他应该是序列中最大数为 M-1 的划分和 N-M 的划分之和, 比如F(6,4),上面例子第三行, 他应该等于对整数 3 的划分, 然后加上 2 的划分(6-4) 所以 F(N,M) = F(N, M-1) + F(N-M,M) 整数划分问题 数 n 的划分是将 n 表示成多个正整数之和的形式 划分可以分为两种情况: A  划分的多个正整数中,正整数的数量是任意的    这又可以分为划分的正整数中,正整数可以相同与

3、不同两类  1.  划分的多个正整数可以相同, 递推方程可以表示为:        (1)   dp[n][m]= dp[n][m-1]+ dp[n-m][m]                       dp[n][m]表示整数 n 的划分中,每个数不大于 m 的划分数。            则划分数可以分为两种情况:              a. 划分中每个数都小于 m, 相当于每个数不大于 m- 1, 故               划分数为 dp[n][m-1].              b. 划分中有一个数为 m. 那就在 n中减去 m , 剩下的就相当

4、               于把 n-m 进行划分, 故划分数为 dp[n-m][m];        (2)   dp[n][m]= dp[n][m+1]+ dp[n-m][m]              dp[n][m]表示整数 n 的划分中,每个数不小于 m 的划分数。            同理可证明该式。    2.  划分的多个正整数互不相同,递推方程可以表示为:           (1)    dp[n][m]= dp[n][m-1]+ dp[n-m][m-1]               dp[n][m]表示整数 n 的划分中,每个数不大于 m 的

5、划分数。             同样划分情况分为两种情况:               a.  划分中每个数都小于 m, 相当于每个数不大于 m- 1,             划分数为 dp[n][m-1].               b.  划分中有一个数为 m. 在 n 中减去 m, 剩下相当对             n- m 进行划分,并且每一个数不大于 m- 1,故划分数             为 dp[n-m][m-1]             (2)    dp[n][m]= dp[n][m+1]+ dp[n-m][m]            

6、   dp[n][m]表示整数 n 的划分中,每个数不小于 m 的划分数。 B  划分的多个正整数中,正整数的数量是固定的        把一个整数 n 无序划分成 k 份互不相同的正整数之和的方法总数。    方程为:       dp[n][k]= dp[n-k][k]+ dp[n-1][k-1];    证明方法参考: http://www.mydrs.org/program/html/0369.htm    另一种理解,总方法可以分为两类:    第一类: n 份中不包含 1 的分法,为保证每份都 >= 2,可以先拿出 k 个 1 分    到每一份,然后再把剩

7、下的 n- k 分成 k 份即可,分法有: dp[n-k][k]    第二类: n 份中至少有一份为 1 的分法,可以先那出一个 1 作为单独的1份,剩    下的 n- 1 再分成 k- 1 份即可,分法有:dp[n-1][k-1] 相关习题: :8080/online/?action=problem&type=show&id=11299&courseid=0 #include    #include    using namespace std;    int dp[4505][4505];    int solve(int n

8、int m)    {    int i,j;    for(i=1;i<=n;++i)    {       dp[i][0]=0;       for(j=1;j<=m;++j)       {        dp[0][j]=0;        if(i>=j)         dp[i][j]=dp[j-1][j]+1;        else       {         dp[i][j]=dp[i-1][j]+dp[i][j-i];         if(dp[i][j]>=1000000007)          dp[i][j]-=100000

9、0007;        }       }    }    return dp[n][m];    }    int main()    {    int n,m;    scanf("%d %d",&n,&m);    printf("%d\n",solve(n,m));    return 0;    } 类似问题:M个小球装N个盒子,或者苹果装盘问题 把M个球放到N个盒子,允许有空的盒子(不放球),有多少种放法? 典型的DP问题: 用F(m,n)表示有多少种放法: 如果m=0 或者 m=1 , F = 1 如果n=0 或者 n=1   , F

10、 =1 既F(0,0) = F(0,1) = F(1,0) = F(1,1) = 1 否则 F = F(m-n,n) + F(m,n-1)这就是DP的解空间递归解 每一次DP应用,都是一次创造 #include        int F(int m,int n);       int main()    {        int m;        int n;        int f;        printf("Intput the number of M and N \n");        scanf("%d %d",&m,&n

11、);        f = F(m,n);        printf("There are total %d methods\n\n",f);    };    int F(int m,int n)    {        if(m==0||m==1) return 1;        if(n==0||n==1) return 1;        if(m

12、可以分解为两个奇素数之和。对此问题扩展,如果一个整数能够表示成两个或多个素数之和,则得到一个素数和分解式。对于一个给定的整数,输出所有这种素数和分解式。注意,对于同构的分解只输出一次(比如5只有一个分解2 + 3,而3 + 2是2 + 3的同构分解式)。 例如,对于整数8,可以作为如下三种分解: (1) 8 = 2 + 2 + 2 + 2 (2) 8 = 2 + 3 + 3 (3) 8 = 3 + 5 【算法分析】 由于要将指定整数N分解为素数之和,则首先需要计算出该整数N内的所有素数,然后递归求解所有素数和分解即可。 C++代码实现如下:   #include 

13、eam>    #include     #include     #include     using namespace std;       // 计算num内的所有素数(不包括num)    void CalcPrimes(int num, vector &primes)    {        primes.clear();        if (num <= 2)            return;                primes.push_back(2);        for 

14、int i = 3; i < num; i += 2)      {            int root = int(sqrt(i));            int j = 2;            for (j = 2; j <= root; ++j)         {                if (i % j == 0)                    break;            }            if (j > root)                primes.push_back(i);        }    } 

15、      // 输出所有素数组合(递归实现)    int PrintCombinations(int num, const vector &primes, int from, vector &numbers)    {        if (num == 0)      {            cout << "Found: ";            copy(numbers.begin(), numbers.end(), ostream_iterator(cout, " "));            cout << '\n';   

16、         return 1;        }                int count = 0;                // 从第from个素数搜索,从而避免输出同构的多个组合        int primesNum = primes.size();        for (int i = from; i < primesNum; ++i)     {            if (num < primes[i])                break;            numbers.push_back(primes[i]);   

17、         count += PrintCombinations(num - primes[i], primes, i, numbers);            numbers.pop_back();        }                return count;    }       // 计算num的所有素数和分解    int ExpandedGoldbach(int num)    {        if (num <= 3)            return 0;                vector primes; 

18、       CalcPrimes(num, primes);                vector numbers;        return PrintCombinations(num, primes, 0, numbers);    }       int main()    {        for (int i = 1; i <= 20; ++i)     {            cout << "When i = " << i << ":\n";            int count = ExpandedGoldbach(i);            cout << "Total: " << count << "\n\n";        }    }

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服