POJ2142:The Balance——题解

http://poj.org/problem?id=2142

题目大意:有一天平和两种数量无限的砝码(重为a和b),天平左右都可以放砝码,称质量为c的物品,要求:放置的砝码数量尽量少;当砝码数量相同时,总质量尽量小。

显然转换成ax+by=c的问题,求|x|+|y|最小且|ax|+|by|最小的可行解。

又是exgcd板子题。

#include<cstdio>
#include<cctype>
#include<iostream>
using namespace std;
typedef long long ll;
int gcd(int a,int b){
    return b?gcd(b,a%b):a;
}
void exgcd(int a,int b,int &x,int &y){
    if(b==0){
    x=1;y=0;
    return;
    }
    exgcd(b,a%b,x,y);
    int temp;
    temp=x;
    x=y;
    y=temp-(a/b)*y;
    return;
}
int main(){
    int a,b,c;
    while(cin>>a>>b>>c){
    if(a==b&&b==c&&a==0)return 0;
    int x1,y1,x2,y2,x,y;
    int g=gcd(a,b);
    a/=g;b/=g;c/=g;
    exgcd(a,b,x,y);
    x1=(x%b*c%b+b)%b;
    y1=(c-x1*a)/b;
    if(y1<0)y1=-y1;
    y2=(y%a*c%a+a)%a;
    x2=(c-y2*b)/a;
    if(x2<0)x2=-x2;
    if(x1+y1>x2+y2||(x1+y1==x2+y2&&a*x1+b*y1>a*x2+b*y2)){
        y1=y2;x1=x2;
    }
    printf("%d %d
",x1,y1);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/luyouqi233/p/7904223.html