ваш стол выглядит так:
a b | sab
c d | scd
----------
sac sbd| S
и у вас есть 4 неизвестных с 4 ограничениями (на минутку забудьте о максимальных ограничениях на a, b, c и d):
A + B = SAB
а + с = * 1008 мешок *
C + D = SCD
B + D = SBD
4 ограничения не являются независимыми (в противном случае у вас будет только одно возможное решение!), И
бит алгебры показывает, что матрица этой линейной системы имеет ранг 3. таким образом, у вас есть одна степень
свобода играть с выберите, например, и затем измените от 0 до его максимального значения. Для каждого значения
затем вычислите b, c и d, используя ограничения суммы строк и столбцов, и убедитесь, что они удовлетворяют
Позитивность и максимальные ограничения.
Код R для вашего примера выглядит следующим образом:
sab <- 59
scd <- 64
sac <- 31
sbd <- sab + scd - sac ### this is always true
amax <- 20
bmax <- 40
cmax <- 12
dmax <- 70
### let us vary a, our only degree of freedom
for (a in 0:amax){
### let us compute b, c and d by satisfying row and column sum constraints
b <- sab - a
c <- sac - a
d <- sbd - b
### let us check inequality constraints
if (b <= bmax && b>= 0 && c <= cmax && c >= 0 && d <= dmax && d >= 0){
cat("\nSolution:\n")
print(m <- rbind(c(a,b),c(c,d)))
cat("\nrowSums:", rowSums(m))
cat("\ncolsums:", colSums(m))
cat("\n---------------\n")
if (! identical(rowSums(m), c(sab,scd)))
stop("\nrow sum is not right!\n")
if (! identical(colSums(m), c(sac,sbd)))
stop("\ncolumns sum is not right!\n")
}
}