División de números (recursividad)

División de números

Descripción del título
Divida los números enteros en componentes, y cada parte no puede estar vacía. Dos soluciones son diferentes (independientemente del orden).

Por ejemplo: Las siguientes tres clasificaciones se consideran iguales:

1,1,5; 1,5,1; 1,1,5.

Pregunte cuántas divisiones diferentes hay.

Formato de entrada
Dos enteros y.

Formato de
salida Salida de diferentes números de división.

Muestra Muestra de
entrada

7 3
Muestra de salida
4
Explicación de muestra
Cuatro métodos de clasificación son: 1,1,5; 1,2,4; 1,3,3; 2,2,3.

Rango de datos y sugerencias
Para el 100% de los datos, 6≤n≤200, 2≤k≤6.

Ideas para resolver problemas

Sea f (i, j) el
valor inicial del número de esquemas dividido por i en j :
cuando j = 1 e i = j , f (i, j) = 1
Recurrencia:
dos casos

1. Al menos una de las j acciones es 1 y el número de planes es f (i-1, j-1)
2. No hay 1 en j acciones, considere dividir ij en j acciones y luego vaya a cada una de j comparte Copias +1, el número de planes es f (ij, j)

Fórmula de razonamiento tardío :
f (i, j) = f (i - 1, j - 1) + f (i - j, j) f (i, j) = f (i-1, j-1) + f ( ij, j)f ( yo ,j )=f ( yo-1 ,j-1 )+f ( yo-j ,j )

Código AC

#include<cstdio>
#include<algorithm>
using namespace std;
int n,k,f[205][10];
int main()
{
    
    
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=min(i,k);j++)
	  if(j==1||i==j)f[i][j]=1;//初值
	  else f[i][j]=f[i-j][j]+f[i-1][j-1];//递归
	printf("%d",f[n][k]);  
 	return 0;
}

Gracias

Supongo que te gusta

Origin blog.csdn.net/weixin_45524309/article/details/111400379
Recomendado
Clasificación