数论:整数划分方案(其他解决方案)

文章讲述了如何用C++编程解决整数划分问题,介绍了两种方法:一种是巧妙的递归算法(方案一),另一种是基于位数的递归计数法(方案二)。后者提到可以应用动态规划优化效率。
摘要由CSDN通过智能技术生成

问题

整数划分就是将一个正整数表示成一系列正整数之和,问有多少种不同划分方案!  例如整数6可以划分成已下11种方案:
        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 

输入正整数n,计算n有多少种不同划分方案。

方案一,常见解决方法

#include<iostream>
using namespace std;
int q(int n,int m) {
    if ((n < 1) || (m < 1))return 0;
    if ((n == 1) || (m == 1))return 1;
    if (n < m)return q(n, n);
    if (n == m)return q(n, m - 1) + 1;
    return q(n, m - 1) + q(n - m, m);
}
int main() {
    int n;
    cin >> n;
    cout << q(n, n) << endl;
    return 0;
}

这个方法写的十分巧妙,巧妙到我看不出门路,但笨有笨的方法,下面是我的解决方案

方案二,位数解决法

#include<iostream>

using namespace std;

int count(int n, int num)
{
	if (n == 0 || num==0 || n==1|| num==1)
		return 1;

	int c = (num / n) - 1;
	int y = (num % n) + (c * n);

	if (y > n)
		return count(n, y) + count(n - 1, num);
	else if (y <= n)
		return count(y, y) + count(n - 1, num);

}


int main()
{
	int num;
	while(cin >> num)
	cout<<count(num, num)<<endl;
}

原理特别简单

例如我输入了数6;

数字6,最多被拆分为,6份 1+1+1+1+1+1

然后是5份 先给每份一个1,1+1+1+1+1,余下一个1就可以随便放置

                                                1        1        1        1        1
                                                1

当4份的时候,同上,就会余下2,这个时候,只要对2进行位数求解,1+1,2,也就是

                                                1        1        1        1
                                                1        1                        或者

                                                1        1        1        1
                                                1                                 
                                                1                                 两种情况

同理,当分成,2份的时候,就会以下三种情况,一层1,一层1,的砌起来

1        1                1        1                1        1
1                          1        1                1        1
1                          1                          1        1     
1                          1
1
可以很明显的看出,当一层墙垒好,那么我就只需要,余下的1,也就是剩下的砖头怎么放置就好了,再带入数位解决方法就可以了,感觉这里可以加入一点动态规划,更加节约时间,但苦于学业不精,等以后加上。

  • 11
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值