整数划分问题
2017-09-03 09:37
330 查看
为求不同的划分,则将划分的元素按照从大到小排序(全局序约束去除了对称性带来的重复)
设n的最大加数<=m的划分数为q(n,m)
1、q(n,1)=1
2、q(n,m)=q(n,n),m>n
3、q(n,n)=q(n,n-1)+1
4、q(n,m)=q(n,m-1)+q(n-m,m)
对于4的解释:
a。划分中包含m的情况,即{m,{x1,x2,...,xi}},其中{x1,x2,...,xi}和为n-m,因此在这种情况下为f(n-m,m)
b。划分中不包含m的情况,则划分中所有值都比m小,即n的(m-1)划分,个数为f(n,m-1)
#include<iostream>
using namespace std;
int q(int n, int m)
{
if ((n < 1) || (m < 1))return 1;
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, m;
cin >> n;
cin >> m;
cout << q(n, m);
system("pause");
}
设n的最大加数<=m的划分数为q(n,m)
1、q(n,1)=1
2、q(n,m)=q(n,n),m>n
3、q(n,n)=q(n,n-1)+1
4、q(n,m)=q(n,m-1)+q(n-m,m)
对于4的解释:
a。划分中包含m的情况,即{m,{x1,x2,...,xi}},其中{x1,x2,...,xi}和为n-m,因此在这种情况下为f(n-m,m)
b。划分中不包含m的情况,则划分中所有值都比m小,即n的(m-1)划分,个数为f(n,m-1)
#include<iostream>
using namespace std;
int q(int n, int m)
{
if ((n < 1) || (m < 1))return 1;
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, m;
cin >> n;
cin >> m;
cout << q(n, m);
system("pause");
}