es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema de programación dinámica “Two Sets II”

Estoy tratando de resolver .

Dice lo siguiente:

Tu tarea es contar el número de maneras en que los números 1, 2,…, n se pueden dividir en dos conjuntos de igual suma.

Por ejemplo, si n=7, hay cuatro soluciones:

{1,3,4,6} y {2,5,7}

{1,2,5,6} y {3,4,7}

{1,2,4,7} y {3,5,6}

{1,6,7} y {2,3,4,5}

Esto es lo que tengo hasta ahora:

int n;
cin >> n;
int maxSum = n * (n + 1) / 2;
if (maxSum % 2 != 0) {
cout << 0 << endl;
return 0;
}
maxSum /= 2;
vector<vector<long>> dp(n+1, vector<long>(maxSum+1));
dp[0][0] = 1;
for (int currentNumIncluded = 1; currentNumIncluded <= n; ++currentNumIncluded) {
for (int currentTargetSum = 0; currentTargetSum <= maxSum; ++currentTargetSum) {
dp[currentNumIncluded][currentTargetSum] = dp[currentNumIncluded-1][currentTargetSum];
int remainder = currentTargetSum – currentNumIncluded;
if (remainder >= 0) {
dp[currentNumIncluded][currentTargetSum] += dp[currentNumIncluded-1][remainder];
dp[currentNumIncluded][currentTargetSum] %= 1000000007;
}
}
}
cout << dp[n][maxSum]/2 << endl;

Uso DP simple para resolverlo. Sin embargo, no pasa 5 de 26 casos de prueba. Busqué y resulta que si imprimimos dp[n-1][maxSum] en lugar de dp[n][maxSum]/2, todo funciona. ¿Podría alguien explicarme esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema puede estar relacionado con el hecho de que divides dp[n][maxSum] por 2 al final, mientras se calcula el resultado. Dividir por 2 asume que cada solución se cuenta dos veces, una para cada uno de los dos conjuntos de suma igual, pero esto puede no ser siempre el caso.

    Por ejemplo, si n=4, la única solución es {1,4} y {2,3}, que es contada una vez por tu algoritmo, pero solo pertenece a un conjunto de suma igual. Por lo tanto, dividir por 2 llevaría a un resultado incorrecto.

    Imprimir dp[n-1][maxSum] en lugar de dp[n][maxSum]/2 podría funcionar porque no asume que cada solución se cuenta dos veces. En otras palabras, cuenta cada solución solo una vez, independientemente de a qué conjunto de los dos pertenece.

    Sin embargo, esto es solo una suposición sin conocer los casos de prueba exactos que fallan y el resultado esperado para esos casos. También es posible que el problema esté relacionado con una parte diferente de tu código o algoritmo.

Comments are closed.