Algorithm 用已知行'填充表格;s和列';s总和
我知道矩阵中行和列的和的值。矩阵很小(最大10x10),数值范围为0到99 是否可以从该数据生成任何矩阵?我对所有可能的组合都不感兴趣。只要一个就可以了 前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
我认为这是不可能的,因为答案不止一个。比如说,
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]--;
}