A- número de cuestiones electorales
Descripción
Dado n enteros positivos, la suma de ellos seleccionar el número K es S, n los requisitos de entrada, K, S, salida de la cantidad de diferentes opciones.
Muestra
input:
1
10 3 10
1 2 3 4 5 6 7 8 9 10
output:
4
Idea
En primer lugar, he utilizado la lista para almacenar el número seleccionado, para facilitar la adición de elementos, eliminar elementos, también se puede saber el número de la hora seleccionada. Usando enumeración recursiva selectiva, para cada número de términos, y no se seleccionan seleccionarlo teniendo en cuenta su condición, cada elemento añadido a un valor correspondiente a la suma se resta, y cuando el número de la lista es igual a la suma exactamente igual a k 0, es decir, una solución calificado, mientras que cuando K excede el número de lista o no sumar atrás en el tiempo en este caso es de forma recursiva ha sido menor que cero.
Resumen
La idea básica se enumera, para toda la disposición, cada subconjunto a su vez determina si se cumplen los requisitos. Con el fin de reducir la complejidad, debe ser selectivamente Enumerar muchos casos, obviamente, skip no se establece, como un subconjunto del número de elementos excede K, y un subconjunto de elementos que S, se produce cuando la solución de nuevo cualificado en el tiempo, porque entonces adicionalmente elemento añadido recursiva debe también no es elegible.
códigos
#include <iostream>
#include <list>
using namespace std;
int a[16];
int t,n, k, s;
int amount = 0;
void solve(int i,int sum,list<int> &res) {
if (res.size()==k&&sum == 0) { amount++; return; }
if (i >= n)return;
if (res.size()>k||sum < 0)return;
solve(i + 1, sum,res);
res.push_back(a[i]);
solve(i + 1, sum - a[i],res);
res.pop_back();
}
int main()
{
cin >> t;
while (t--)
{
amount = 0;
scanf("%d%d%d", &n, &k, &s);
memset(a, 0, sizeof(int));
for (int i = 0; i < n; i++)
cin >> a[i];
list<int> r;
solve(0, s, r);
printf("%d\n", amount);
}
}