Divisão de número (recursão)

Divisão de números

Descrição do título
Divida os inteiros em componentes, e cada parte não pode ficar vazia. Duas soluções são diferentes (independentemente da ordem).

Por exemplo: As três classificações a seguir são consideradas iguais:

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

Pergunte quantas divisões diferentes existem.

Formato de entrada
Dois inteiros e.

Formato de
saída Produz números de divisão diferentes.

Amostra Amostra de
entrada

7 3
Amostra de saída
4
Explicação da amostra
Quatro métodos de classificação são: 1,1,5; 1,2,4; 1,3,3; 2,2,3.

Faixa de dados e dicas
Para 100% dos dados, 6≤n≤200, 2≤k≤6.

Ideias para resolução de problemas

Seja f (i, j) o
valor inicial do número de esquemas dividido por i em j :
quando j = 1 ei = j , f (i, j) = 1
Recursão:
dois casos

1. Pelo menos uma das ações j é 1, e o número de planos é f (i-1, j-1)
2. Não há 1 em ações j, considere dividir ij em ações j e, em seguida, vá para cada uma j compartilha Cópias +1, o número de planos é f (ij, j)

Fórmula de raciocínio tardio :
f (i, j) = f (i - 1, j - 1) + f (i - j, j) f (i, j) = f (i-1, j-1) + f ( ij, j)f ( i ,j )=f ( eu-1 ,j-1 )+f ( eu-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;
}

Obrigado

Acho que você gosta

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