Sto provando a generare una partizione decente del numero intero dato N
numerato K
in ordine lessicografico, ad es. per N = 5, K = 3
abbiamo ottenuto:Generazione della partizione intera tramite il numero
5 = 1 + 1 + 1 + 1 + 1
5 = 1 + 1 + 1 + 2
5 = 1 + 1 + 3
5 = 1 + 2 + 2
5 = 1 + 4
5 = 2 + 3
5 = 5
E il terzo è 1 + 1 + 3
. Come posso generare questo senza generare ogni partizione (in linguaggio C, ma soprattutto ho bisogno dell'algoritmo)?
Andare a trovare il numero massimo di partizioni (assumendo che siamo in grado di trovare il numero di partizioni d[i][j]
, dove i
è il numero e j
è intero massimale nella sua partizione), quindi diminuire il numero originale e il numero che stiamo cercando. Quindi sì, sto cercando di usare la programmazione dinamica. Sto ancora lavorando al codice.
Questo non funziona affatto:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *F1, *F2;
main()
{
long long i, j, p, n, k, l, m[102][102];
short c[102];
F1 = fopen("num2part.in", "r");
F2 = fopen ("num2part.out", "w");
n = 0;
fscanf (F1, "%lld %lld", &n, &k);
p = 0;
m[0][0] = 1;
for (i = 0; i <= n; i++)
{
for (j = 1; j <= i; j++)
{
m[i][j] = m[i - j][j] + m[i][j - 1];
}
for (j = i + 1; j <= n; j++)
{
m[i][j] = m[i][i];
}
}
l = n;
p = n;
j = n;
while (k > 0)
{
while (k < m[l][j])
{
if (j == 0)
{
while (l > 0)
{
c[p] = 1;
p--;
l--;
}
break;
}
j--;
}
k -=m[l][j];
c[p] = j + 1;
p--;
l -= c[p + 1];
}
//printing answer here, answer is contained in array from c[p] to c[n]
}
Usa programmazione dinamica per trovare il numero di (n, k) -partitions per n
zch
Cercando di trovare il numero massimo nella partizione (assumendo che possiamo trovare il numero di partizioni 'd [i] [j]', dove 'i' è numero e' j' è il numero intero massimo nella sua partizione), quindi diminuisci il numero originale e numero che stiamo cercando, ancora lavorando su di esso. – siziyman