问题描述
现在有a,b,c三种原料,如果他们按x:y:z混合,就能产生一种神奇的物品d。
当然不一定只产生一份d,但a,b,c的最简比一定是x:y:z
现在给你3种可供选择的物品:
每个物品都是由a,b,c以一定比例组合成的,求出最少的物品数,使得他们能凑出整数个d物品(这里的最少是指三者个数的总和最少)
当然不一定只产生一份d,但a,b,c的最简比一定是x:y:z
现在给你3种可供选择的物品:
每个物品都是由a,b,c以一定比例组合成的,求出最少的物品数,使得他们能凑出整数个d物品(这里的最少是指三者个数的总和最少)
输入格式
第一行三个整数,表示d的配比(x,y,z)
接下来三行,表示三种物品的配比,每行三个整数(<=10000)。
接下来三行,表示三种物品的配比,每行三个整数(<=10000)。
输出格式
四个整数,分别表示在最少物品总数的前提下a,b,c,d的个数(d是由a,b,c配得的)
目标答案<=10000
如果不存在满足条件的方案,输出NONE
目标答案<=10000
如果不存在满足条件的方案,输出NONE
样例输入
3 4 5
1 2 3
3 7 1
2 1 2
1 2 3
3 7 1
2 1 2
样例输出
8 1 5 7
看到这道题的标签是g背包,以为是dp背包问题,然后开始想背包问题有01背包,完全背包,多重背包,混合背包。g背包是啥QAQ
![](https://img2020.cnblogs.com/blog/1987729/202004/1987729-20200410105921750-902816302.png)
看了大佬的题解才知道完全是数学问题,参考自https://blog.csdn.net/starlet_kiss/article/details/87077918
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 ll g[4][4]; 5 ll gcd(ll x, ll y) { 6 if (y == 0) { 7 return x; 8 } else { 9 return gcd(y, x % y); 10 } 11 } 12 int main() { 13 ll a, b, c; 14 cin >> a >> b >> c; 15 for (int i = 1; i <= 3; i++) { 16 for (int j = 1; j <= 3; j++) { 17 cin >> g[i][j]; 18 } 19 } 20 ll A = a * g[1][2] - b * g[1][1]; ll B = a * g[2][2] - b * g[2][1]; ll C = a * g[3][2] - b * g[3][1]; 21 ll D = b * g[1][3] - c * g[1][2]; ll E = b * g[2][3] - c * g[2][2]; ll F = b * g[3][3] - c * g[3][2]; 22 ll x = -B * F + C * E; ll y = -D * C + A * F; ll z = -A * E + B * D; 23 if (x < 0) { 24 x = -x; 25 y = -y; 26 z = -z; 27 } 28 if (x < 0 || y < 0 || z < 0) { 29 cout << "NONE" << endl; 30 return 0; 31 } 32 ll t = gcd(x, y); 33 t = gcd(t, z); 34 cout << x / t << " " << y / t << " " << z / t << " " << (x * g[1][1] + y * g[2][1] + z * g[3][1]) / (a * t) << endl; 35 return 0; 36 }