问题
整数划分就是将一个正整数表示成一系列正整数之和,问有多少种不同划分方案! 例如整数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,也就是剩下的砖头怎么放置就好了,再带入数位解决方法就可以了,感觉这里可以加入一点动态规划,更加节约时间,但苦于学业不精,等以后加上。