我試圖按照字典順序(例如,編號)生成編號爲K
的給定整數N
的像樣分區。對於N = 5, K = 3
我們得到:按其編號生成整數分區
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
,第三個是1 + 1 + 3
。 如何在不生成每個分區(使用C語言,但最重要的是我需要算法)的情況下生成此分區?
會發現在分區最大數量(假設我們可以發現分區d[i][j]
,數其中i
是數量和j
是它的分區的最大整數),則減少原來的號碼和電話號碼,我們所期待的。所以是的,我試圖使用動態編程。仍在研究代碼。
這並不在所有的工作:
#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]
}
使用動態編程來發現的(N,K)-partitions數目對於n
zch
試圖在分區中查找最大數目(假設我們可以找到分區數量'd [i] [j]',其中'i'是數字,'j'是其分區中的最大整數),然後減少原始數量並我們正在尋找的數量,仍然在努力。 – siziyman