1998 ACM Finals, Dan Adkins
Farmer John feeds his cows only the finest mixture of cow food, which has three components: Barley, Oats, and Wheat. While he knows the precise mixture of these easily mixable grains, he can not buy that mixture! He buys three other mixtures of the three grains and then combines them to form the perfect mixture.
Given a set of integer ratios barley:oats:wheat, find a way to combine them IN INTEGER MULTIPLES to form a mix with some goal ratio x:y:z.
For example, given the goal 3:4:5 and the ratios of three mixtures:
1:2:3
3:7:1
2:1:2
your program should find some minimum number of integer units (the `mixture') of the first, second, and third mixture that should be mixed together to achieve the goal ratio or print `NONE'. `Minimum number' means the sum of the three non-negative mixture integers is minimized.
For this example, you can combine eight units of mixture 1, one unit of mixture 2, and five units of mixture 3 to get seven units of the goal ratio:
8*(1:2:3) + 1*(3:7:1) + 5*(2:1:2) = (21:28:35) = 7*(3:4:5)
Integers in the goal ratio and mixture ratios are all non-negative and smaller than 100 in magnitude. The number of units of each type of feed in the mixture must be less than 100. The mixture ratios are not linear combinations of each other.
PROGRAM NAME: ratios
INPUT FORMAT
| Line 1: | Three space separated integers that represent the goal ratios |
| Line 2..4: | Each contain three space separated integers that represent the ratios of the three mixtures purchased. |
SAMPLE INPUT (file ratios.in)
3 4 5 1 2 3 3 7 1 2 1 2
OUTPUT FORMAT
The output file should contain one line containing four integers or the word `NONE'. The first three integers should represent the number of units of each mixture to use to obtain the goal ratio. The fourth number should be the multiple of the goal ratio obtained by mixing the initial feed using the first three integers as mixing ratios.
SAMPLE OUTPUT (file ratios.out)
8 1 5 7
解题思路:
赤果果的线性方程组,增广矩阵是3行5列的(aix + biy + ciz - sik = 0),所以有一个自由变量,我们把自由变量设为k,并试图用k来表示x、y、z,所以可以找到通解表达式,并得到最小正整数解。
N[]、D[]表示k前面的分数的分子分母(这样做是为了消除计算误差),因为矩阵只有三行,我勉为其难自己笔算了一下最终表达式,看起来挺蛋疼的……
出乎意料的,有一组数据在矩阵运算中超过了int范围,我太大意了,wa了一次。
针对特定目标比例,从三种已知成分比例的饲料混合物中找出整数倍组合,实现精确配比。采用线性方程组求解方法,通过矩阵运算确定最优解。
462

被折叠的 条评论
为什么被折叠?



