算法设计——整数划分(递归)

感觉递归真的是我永远学不会的
嘤嘤嘤

整数划分

就是看一个整数可以有多少种其他整数相加的和的形式
如:4
4 = 4;
4 = 3 + 1;
4 = 2 + 2;
4 = 2 + 1 + 1;
4 = 1 + 1 + 1 + 1;
这个可以用递归,也可用动态规划
由于算法课还在说递归,所以我们来看看递归的

递归关系

如果设p(n)为正整数n的划分数,则难以找到递归关 系,因此考虑增加一个自变量:将最大加数n1不大于m的划分 个数记作q(n,m)。可以建立q(n,m)的如下递归关系。
当m大于n时,表示最大加数是大于n的,由于加数只能为正整数,所以m不能大于n,q(n,m)=q(n,n)
**当m等于n时,**我们可以把它看做最大加数等于自己的划分加上最大加数为n-1的划分 q(n,m)=1+q(n,n-1)
当m小于n时,依旧等于最大加数m的划分加上m-1的划分,最大加数为m的划分中加数必定含有m,所以划分就等于n-m的最大加数为m的划分,q(n,m)=q(n,m-1)+q(n-m,m),这里可能有点难理解,多理两遍
当m等于1时,只有一种划分,当n等于1时也只有一种划分

代码实现


#include<stdio.h>
int fun(int x,int y){ 
	if(x==1||y==1) return 1;
	if(x==y) return 1+fun(x,x-1);
	if(y>x) return fun(x,x);
	if(y<x) return fun(x,y-1)+fun(x-y,y);
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){ 
		int n;
		scanf("%d",&n);
		int ans=fun(n,n);
		printf("%d\n",ans); 
	}
	return 0;
}
发布了22 篇原创文章 · 获赞 1 · 访问量 1015

猜你喜欢

转载自blog.csdn.net/Doro_/article/details/104832207
今日推荐