poj 2142 The Balance(扩展欧几里得)
2014-02-06 20:13
302 查看
题意:给出两种质量的砝码,和一份药品,问要多少砝码能称出物品,砝码的个数满足两种砝码的数量和尽量小,如果还有多解满足两种砝码的总质量最少。
思路:比较简单的扩展欧几里得。很容易列出方程ax+by=d,扩展欧几里得直接求解~但是此时求出的只是一组可行解,我们要对其进行调整,我们知道若x和y是方程的解,那么x+kb,y-ka也是方程的解,k是整数。根据这个去调整解,获得一个最优的就行了。
代码:
思路:比较简单的扩展欧几里得。很容易列出方程ax+by=d,扩展欧几里得直接求解~但是此时求出的只是一组可行解,我们要对其进行调整,我们知道若x和y是方程的解,那么x+kb,y-ka也是方程的解,k是整数。根据这个去调整解,获得一个最优的就行了。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<set> #include<stack> #include<cmath> #include<vector> #define inf 0x3f3f3f3f #define Inf 0x3FFFFFFFFFFFFFFFLL #define eps 1e-9 #define pi acos(-1.0) using namespace std; typedef long long ll; int ext_gcd(int a,int b,int &x,int &y) { if(b==0) { x=1;y=0; return a; } int d=ext_gcd(b,a%b,y,x); y-=a/b*x; return d; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int a,b,c,d,x,y; while(~scanf("%d%d%d",&a,&b,&c)) { if(a==0&&b==0&&c==0) break; d=ext_gcd(a,b,x,y); c/=d;a/=d;b/=d; x*=c;y*=c; while(abs(x)+abs(y)>abs(x-b)+abs(y+a)) {x-=b;y+=a;} while(abs(x)+abs(y)>abs(x+b)+abs(y-a)) {x+=b;y-=a;} while((abs(x)+abs(y)==abs(x-b)+abs(y+a))&&(abs(a*x)+abs(b*y)>abs((x-b)*a)+abs((y+a)*b))) {x-=b;y+=a;} while((abs(x)+abs(y)==abs(x+b)+abs(y-a))&&(abs(a*x)+abs(b*y)>abs((x+b)*a)+abs((y-a)*b))) {x+=b;y-=a;} x=abs(x);y=abs(y); printf("%d %d\n",x,y); } return 0; }
相关文章推荐
- POJ 2142:The Balance_扩展欧几里得
- poj 2142 The Balance 扩展欧几里得
- POJ 2142 - The Balance [ 扩展欧几里得 ]
- poj 2142 The Balance (扩展欧几里得 数学)
- POJ 2142:The Balance_扩展欧几里得(多组解)
- POJ 2142:The Balance_扩展欧几里得
- poj 2142 The Balance 扩展欧几里得
- POJ 2142 The Balance 扩展欧几里得,求|x|+|y|最小
- poj 2142 The Balance 扩展欧几里得
- [POJ 2142]The Balance(扩展欧几里得)
- POJ2142_The Balance_扩展欧几里得
- POJ - 2142 The Balance(扩展欧几里得求解不定方程)
- POJ-2142-The Balance(扩展欧几里得)
- poj 2142 The Balance 数论-扩展欧几里得
- POJ 2142 The Balance 求|x|+|y|最小(扩展欧几里得)
- poj 2142 The Balance (基础扩展欧几里得)
- POJ 2142 The Balance (扩展欧几里德)
- poj 2142 扩展欧几里得解ax+by=c
- POJ 2142 The Balance(扩展欧几里德解方程)
- POJ 1061 && POJ 2142 两道扩展欧几里得简单题