Algorithm 用已知行'填充表格;s和列';s总和

Algorithm 用已知行'填充表格;s和列';s总和,algorithm,Algorithm,我知道矩阵中行和列的和的值。矩阵很小(最大10x10),数值范围为0到99 是否可以从该数据生成任何矩阵?我对所有可能的组合都不感兴趣。只要一个就可以了 前 我认为这是不可能的,因为答案不止一个。比如说, 0 5 2 0 0 0 2 0 0 生成与您给出的矩阵相同的行和列总和。如果存在答案,此代码将找到一个: int n, m; int rows[n], cols[m]; int answer[n][m]; int n, m; int rows[n], cols[m]; int answer

我知道矩阵中行和列的和的值。矩阵很小(最大10x10),数值范围为0到99

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


我认为这是不可能的,因为答案不止一个。比如说,

0 5 2
0 0 0
2 0 0

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

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

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;
    }
}
intn,m;
int行[n],列[m];
int答案[n][m];
int n,m;
int行[n],列[m];
int答案[n][m];
对于(int i=0;i0&&j列[j])
add=cols[j];
如果(添加>99)
加法=99;
答复[i][j]=添加;
需要-=添加;
cols[j]=add;
}
}
int n,m;
int行[n],列[m];
int答案[n][m];
while(true){
布尔值=false;
int行=-1,列=-1;
对于(int i=0;i0&&cols[j]>0&&found==false | | | Math.min(行[i],列[j])>Math.min(行[row],列[cols])){
发现=真;
行=i;
col=j;
}
如果(!找到)
打破
回答[行][列]++;
行[行]——;
科尔斯山;
}

工作原理:每次我们尝试使用最左边单元格的col和row。

我知道。我需要任何答案。编辑问题以澄清这一事实。您可能还会找到以下感兴趣的文章:这段代码是如何工作的?为什么工作?您能详细说明一下吗?这是一种贪婪算法。每次我们填充一行。为了填充行,我们尝试所有单元格从左到右,按不超过99的方式在每个单元格中输入数字,然后在列中输入左单元格。但我知道这是错误的。请稍候,我将发布正确的解决方案:)它对我有效。=)为什么您认为此代码不正确?例如:行{1,1,1,1100},列{1,1,1,1100}。
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;
    }
}
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]--;
}