El número de temas 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;
}