Ventiladores emite tickets (número acumulado de permutaciones y combinaciones en busca de las especies, la programación dinámica)

tema de fondo

partido de fútbol sin precedentes que se realizará. boletos para el juego de taquilla esperando en una larga cola de fans compran entradas.

De acuerdo con lo dispuesto en el billete, cada compradores ticket de compra un billete, y el precio de cada billete es de 50 yuanes. Hay personales de mano N $ 50 monedas de una larga lista de fans, y otra N valor nominal de 100 yuanes personales de mano de monedas. Suponiendo que no hay ningún cambio en la taquilla comenzó la venta de entradas. ¿Es este el tipo de 2N cómo muchos fans haciendo cola billete no puede encontrar el dinero sin situación embarazosa.

título Descripción

Por ejemplo, cuando n = 2, el valor nominal de 50 yuanes de mano ventiladores que muestra con el A, 100 representa un ventilador de dólares que se sostienen con B. Se puede llegar hasta dos conjuntos de diferentes colas, el conductor no va a no encontrar el dinero.

La primera: AABB

El segundo: ABAB

[Tareas de programación]

Para un n dado (0≤n≤20), calcular el número de 2N de aficionados haciendo cola, no se puede encontrar la taquilla no lo hará dinero.

Formato de entrada

Un entero que representa el valor de N

Formato de salida

Un entero que representa el número de programas

entrada y salida de la muestra

Entrada # 1

2

Salida # 1

2

ideas:

  1. Si yo personalmente he alineado orden, entonces la primera persona que he probablemente tomará $ 50, que puede ser tomar 100
  2. J individuos he asumido antes que la persona es tomar un $ 50, entonces, si la i-ésima persona es tomar un $ 50, entonces el primer I-1 j-1 individuos tomaron 50-yuan, si la i-ésima toma individual es 100, entonces antes de i-1 j tiene una visión personal es $ 50,
  3. Por lo que podemos llamar la fórmula recursiva: dp [i] [j] = dp [i-1] [j-1] + dp [i-1] [j] // dp [i] [j] denota el i frente j individuo tomó un 50 yuanes
#include<iostream>
using namespace std;
// dp[i][j] = dp[i-1][j-1] +dp[i-1][j]
int main(){//dp[i][j] 表示前 i 个人有 j 个人手上拿着50块 
	long long dp[50][50]={0},n;
	cin>>n;
	dp[0][0]=1;
	for(int i=1;i<=n+n;i++){
		for(int j=1;j<=n;j++){
			if(j+j>=i)dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
		}
	}cout<<dp[n+n][n]<<endl;  //输出2n个人中n个人拿着50的方法数 
	return 0;
} 

 Unidimensional optimización matriz:

#include<iostream>
using namespace std;
int main(){
	long long dp[50]={0},n;
	cin>>n;
	dp[0]=1;
	for(int i=1;i<=n+n;i++){
		for(int j=n;j>=0;j--){
			if(j+j>=i)dp[j]+=dp[j-1];
			else dp[j]=0;  //因为内存重复使用,所以需要重置
		}
	}cout<<dp[n]<<endl;  
	return 0;
} 

 

Publicado 42 artículos originales · alabanza ganado 16 · vistas 3406

Supongo que te gusta

Origin blog.csdn.net/qq_41542638/article/details/98209603
Recomendado
Clasificación