[Programación de pensamiento y de práctica de trabajo Semana3] Una serie de cuestiones electorales

Significado de las preguntas:

Dado n un número entero positivo, el K escoger, por lo que se determinó el número K y S, cuántos esquemas de acceso a la programación.

entrada:

La primera línea da un número entero positivo T (T <= 100), T indica un conjunto de datos. A continuación, cada conjunto de datos a través de dos líneas, la primera línea da los tres números en cuestión están destinados a N, K, S; segunda fila da los n enteros positivos.

Ejemplo de entrada:

1
10 3 10
1 2 3 4 5 6 7 8 9 10

salida:

Para cada conjunto de datos da salida a un entero que representa el número de programas, cada salida por línea.

Salida de muestra:

4

ideas:

El problema de la K n número de elegidos y que establezca y S, para cada número son seleccionados y no seleccionados en ambos casos, por lo que hay 2 ^ n tipo de situaciones, pero la enumeración de alta complejidad, requerida para el caso en el que no razonable eliminado directamente, tales como: y tiene mayor que S, o el número contado es mayor que k. En estos casos, el proceso de selección se puede descartar. Por lo tanto, utilizando el método recursivo, el número n secuencialmente seleccionado y no seleccionado para la determinación, por un proceso recursivo caso patológico directamente en una parte posterior, se detiene la condición rama recursión se satisface en el caso, la variable de recuento +1, y vuelve a la anterior, hasta que haya seleccionado todos los datos.

errores:

Después del final de un conjunto seleccionado de datos, el número n no es los recipientes de conservación de vaciado, de manera que un grupo de datos antes de que el siguiente conjunto de resultados de los datos de los errores de impacto.

código:

#include <iostream>
#include<vector>
using namespace std;
int N,M,SUM;
vector<int> val;
int count=0;
void select(int i,int thesum,vector<int>&arr)
{
	if(arr.size()==M)
	{
		if(thesum==0)
			count++;
		return;
	}
	if(i>=N||thesum<0)
		return;
	select(i+1,thesum,arr);
	arr.push_back(val[i]);
	select(i+1,thesum-val[i],arr);
	arr.pop_back();
}

int main(int argc, char** argv) {
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		val.clear();
		count=0;
		vector<int> arr;
		scanf("%d%d%d",&N,&M,&SUM);
		for(int j=0;j<N;j++)
		{
			int temp;
			scanf("%d",&temp);
			val.push_back(temp);
		}
		select(0,SUM,arr);
		if(i==0)
			printf("%d",count);
		else
			printf("\n%d",count);
	}
	return 0;
}
Publicado 25 artículos originales · ganado elogios 8 · visitas 543

Supongo que te gusta

Origin blog.csdn.net/weixin_44034698/article/details/104716796
Recomendado
Clasificación