填充已知行和列总和的表

时间:2011-03-17 19:32:39

标签: algorithm

我知道矩阵中行和列的和的值。矩阵很小(最大10x10),值在0到99之间。

是否可以从此数据生成任何矩阵?我对所有可能的组合都不感兴趣。只有一个会好的。

实施例。

Task
              sum in columns     2   5   2
sum in rows    
     7                           ?   ?   ?
     0                           ?   ?   ?
     2                           ?   ?   ?

Answer

2   4   1
0   0   0
0   1   1 

3 个答案:

答案 0 :(得分:2)

我认为这不可能,因为答案不止一个。例如,

0 5 2
0 0 0
2 0 0

产生与您给出的矩阵相同的行和列总和。

答案 1 :(得分:1)

如果答案存在,此代码将找到一个:

int n, m;
int rows[n], cols[m];
int answer[n][m];

int n, m;
int rows[n], cols[m];
int answer[n][m];

for (int i = 0; i < n; i++) {
    int need = rows[i];
    for (int j = 0; need > 0 && j < m; j++) {
        int add = need;
        if (add > cols[j])
            add = cols[j];
        if (add > 99)
            add = 99;
        answer[i][j] = add;
        need -= add;
        cols[j] -= add;
    }
}

答案 2 :(得分:1)

int n, m;
int rows[n], cols[m];
int answer[n][m];

while (true) {
    boolean found = false;
    int row = -1, col = -1;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            if (rows[i] > 0 && cols[j] > 0 && (found == false || Math.min(rows[i], cols[j]) > Math.min(rows[row], cols[col])) {
                found = true;
                row = i;
                col = j;
            }
    if (!found)
        break;
    answer[row][col]++;
    rows[row]--;
    cols[col]--;
}

工作原理:每次我们尝试使用col和row与大多数左侧单元格一起使用。